設計模式 --建造者模式

部分文字內容摘自網絡;

建造者模式(Builder Pattern):將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

建造者模式使得建造代碼與表示代碼的分離,可以使客戶端不必知道產品內部組成的細節,從而降低了客戶端與具體產品之間的耦合度,下面通過類圖來幫助大家更好地理清建造者模式中類之間的關係。

  1. 在建造者模式中,指揮者是直接與客戶端打交道的,指揮者將客戶端創建產品的請求劃分爲對各個部件的建造請求,再將這些請求委派到具體建造者角色,具體建造者角色是完成具體產品的構建工作的,卻不爲客戶所知道。
  2. 建造者模式主要用於“分步驟來構建一個複雜的對象”,其中“分步驟”是一個固定的組合過程,而複雜對象的各個部分是經常變化的 
  3. 產品不需要抽象類,由於建造模式的創建出來的最終產品可能差異很大,所以不大可能提煉出一個抽象產品類。
  4. 在前面文章中介紹的抽象工廠模式解決了“系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化。
  5. 由於建造者隱藏了具體產品的組裝過程,所以要改變一個產品的內部表示,只需要再實現一個具體的建造者就可以了,從而能很好地應對產品組成組件的需求變化。
詳細代碼如下

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!");
        }
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章