部分文字內容摘自網絡;
建造者模式(Builder Pattern):將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
建造者模式使得建造代碼與表示代碼的分離,可以使客戶端不必知道產品內部組成的細節,從而降低了客戶端與具體產品之間的耦合度,下面通過類圖來幫助大家更好地理清建造者模式中類之間的關係。
- 在建造者模式中,指揮者是直接與客戶端打交道的,指揮者將客戶端創建產品的請求劃分爲對各個部件的建造請求,再將這些請求委派到具體建造者角色,具體建造者角色是完成具體產品的構建工作的,卻不爲客戶所知道。
- 建造者模式主要用於“分步驟來構建一個複雜的對象”,其中“分步驟”是一個固定的組合過程,而複雜對象的各個部分是經常變化的
- 產品不需要抽象類,由於建造模式的創建出來的最終產品可能差異很大,所以不大可能提煉出一個抽象產品類。
- 在前面文章中介紹的抽象工廠模式解決了“系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化。
- 由於建造者隱藏了具體產品的組裝過程,所以要改變一個產品的內部表示,只需要再實現一個具體的建造者就可以了,從而能很好地應對產品組成組件的需求變化。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BuildFactoryModel
{
class Program
{
static void Main(string[] args)
{
//指令,汽車製造者,製造一輛汽車
Car newcar = CarMaker.Instance.BuildAnCar();
Console.ReadKey();
}
}
}
具體例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BuildFactoryModel
{
/// <summary>
/// 製造基類
/// </summary>
public abstract class Maker
{
/// <summary>
/// 一個抽象的方法。所有制作者都實現這個方法
/// </summary>
/// <returns></returns>
public abstract basicClass build();
/// <summary>
/// 一個虛函數。可以有子類方法來覆蓋
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
virtual public basicClass build(string parm)
{
return new basicClass();
}
}
/// <summary>
/// 發動機製作者
/// </summary>
public class engineMaker : Maker
{
/// <summary>
/// 建造一個發動機
/// </summary>
/// <returns></returns>
public override basicClass build()
{
return new Enginer();
}
}
/// <summary>
/// 控制系統製作者
/// </summary>
public class consysMaker : Maker
{
/// <summary>
/// 建造一個控制系統
/// </summary>
/// <returns></returns>
public override basicClass build()
{
return new ControlSystem();
}
}
/// <summary>
/// 輪胎製作者
/// </summary>
public class wheelMaker : Maker
{
public override basicClass build()
{
return new Wheel();
}
/// <summary>
/// 覆蓋父類的建造方法,使用一個帶參數
/// (複習虛函數使用方法)
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public override basicClass build(string parm)
{
return new Wheel(parm);
}
}
/// <summary>
/// 控制系統製作者
/// </summary>
public class ControlSystemMaker : Maker
{
public override basicClass build()
{
return new ControlSystem();
}
}
/// <summary>
/// 座椅製作者
/// </summary>
public class ChairMaker : Maker
{
/// <summary>
/// 製造座椅
/// </summary>
/// <returns></returns>
public override basicClass build()
{
return new Chair();
}
/// <summary>
/// 製造某個特定座椅
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public override basicClass build(string param)
{
return new Chair(param);
}
}
/// <summary>
/// 汽車製造者
/// </summary>
public class CarMaker
{
/// <summary>
/// 汽車製造者需要的其他部件製作者
/// </summary>
/// 汽車鐵框框製作者
private static carframeMaker carframeMaker;
/// <summary>
/// 汽車座椅製作者
/// </summary>
private static ChairMaker ChairMaker;
/// <summary>
/// 汽車輪胎製作者
/// </summary>
private static wheelMaker wheelMaker;
/// <summary>
/// 汽車發動機製作者
/// </summary>
private static engineMaker engineMaker;
/// <summary>
/// 汽車控制系統製作者
/// </summary>
private static consysMaker consysMaker;
/// <summary>
/// 汽車製作者採用單例模式 靜態屬性,私有構造,
/// 這裏複習單例模式而已
/// </summary>
private static CarMaker _carMaker;
public static CarMaker Instance { get {
if (null == _carMaker) {
_carMaker = new CarMaker();
}
return _carMaker;
}
}
/// <summary>
/// 私有構造函數中實例化這些部件製作者
/// </summary>
private CarMaker() {
if (null == carframeMaker) {
carframeMaker = new carframeMaker();
}
if (null == ChairMaker)
{
ChairMaker = new ChairMaker();
}
if (null == wheelMaker)
{
wheelMaker = new wheelMaker();
}
if (null == engineMaker)
{
engineMaker = new engineMaker();
}
if (null == consysMaker)
{
consysMaker = new consysMaker();
}
}
/// <summary>
/// 建造這個汽車方法
/// </summary>
/// <returns></returns>
public Car BuildAnCar() {
Car car = new Car();
/// 製造鐵殼
car.carframe = (CarFrame)carframeMaker.build();
//製造發動機
car.enginer = (Enginer)engineMaker.build();
//造四個座椅
for (int i = 1; i <= 4; i++)
{
car.Chairs.Add((Chair)ChairMaker.build(i.ToString ()));
}
//造四個輪胎
for (int i = 1; i <= 4; i++)
{
car.wheels.Add((Wheel)wheelMaker.build(i.ToString()));
}
//造控制系統
car.controlsystem = (ControlSystem)consysMaker.build();
return car;
}
}
public class carframeMaker : Maker {
public override basicClass build()
{
return new CarFrame();
}
}
/// <summary>
/// 汽車類
/// </summary>
public class Car {
public List<Wheel> wheels;
public List<Chair> Chairs;
public Enginer enginer;
public ControlSystem controlsystem;
public CarFrame carframe;
public Car() {
Chairs = new List<Chair>();
wheels = new List<Wheel>();
}
}
public class basicClass {
}
/// <summary>
/// 輪子
/// </summary>
public class Wheel :basicClass {
public Wheel (){
Console.WriteLine("Wheel is Ready!");
}
public Wheel(string WheelName){
Console.WriteLine(string.Format( "Wheel {0} is Ready!",WheelName));
}
}
/// <summary>
/// 發動機實體類
/// </summary>
public class Enginer :basicClass{
public Enginer() {
Console.WriteLine("WEnginer is Ready!");
}
}
/// <summary>
/// 控制系統
/// </summary>
public class ControlSystem :basicClass{
public ControlSystem() {
Console.WriteLine("ControlSystem is Ready!");
}
}
/// <summary>
/// 座椅
/// </summary>
public class Chair :basicClass{
public Chair() {
Console.WriteLine("Chair is Ready!");
}
public Chair(string chairname)
{
Console.WriteLine(string.Format("Chair {0}is Ready!",chairname));
}
}
/// <summary>
/// 鐵框框
/// </summary>
public class CarFrame : basicClass {
public CarFrame()
{
Console.WriteLine("CarFrame is Ready!");
}
}
}