1. 程式人生 > >設計模式(C#)——建造者模式

設計模式(C#)——建造者模式

推薦閱讀:

      當一個複雜物件由一些子物件構成,並且子物件的變化會導致複雜物件的修改。這時我們需要提供一種"封裝機制"來隔離出"複雜物件的各個部分"的變化,從而保持系統中的"穩定構建演算法"不隨需求的改變而改變,這就是今天要給大家分享的建造者模式。

建造者模式(Builder Pattern)

      建造者模式屬於建立型模式,將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

建造者模式要素:

1、抽象建造者(Builder):給出一個抽象結論,以規範產品物件的各個組成成分的建造。這個介面規定要實現複雜物件的那些部分的建立,並不涉及具體的物件部件的建立;
2、具體建造者(Concrete Builder):實現建造者介面,針對不同的商業邏輯,具體化複雜物件的各部分的建立。在構造過程完成後,提供產品的例項;
3、指導者(Director):呼叫具體建造者來建立複雜物件的各個部分,在指導者中不涉及具體產品的資訊,只負責保證物件各部分完整建立或按某種順序建立;
4、產品類(Product):需要建立的具體的複雜物件。

下面舉個例子來為大家講解一下吧。

      名稱空間建造者模式中包含Phone手機類充當產品類,Builder基類為抽象建造者,華為HF類、小米XM類、魅族MZ類。另外包含1個手機擴充套件類和1個指導者。本示例向大家演示3個不同的手機廠商在生產比較複雜的汽車時所採用的策略。
      理清了這個邏輯過程之後,下面就具體看下如何用程式碼來表示這種現實生活中的邏輯過程:

1.建立抽象建造者Builder

public abstract class Builder {
 
    protected phone = new Phone();//手機
 
    public abstract void BuildCPU();//CPU
 
    public abstract void BuildBattery();//電池
 
    public abstract void BuildSpeaker();//揚聲器
 
    public abstract void BuildColor();//顏色
 
    public virtual Phone GetPhone() {
        return phone;
    }
}

2.具體建造者(CPU,Battery,Speaker,Color)


public class HW : Builder {
 
    public override void BuildCPU() {
        phone.Carframe = "華為的處理器";
    }
 
    public override void BuildBattery() {
        phone.Battery = 3000;
    }
 
    public override void BuildSpeaker() {
        phone.Speaker= "華為的揚聲器";
    }
 
    public override void BuildColor() {
        phone.Color= "華為的專屬顏色";
    }
}

public class XM : Builder {
 
    public override void BuildCPU() {
        phone.Carframe = "小米的處理器";
    }
 
    public override void BuildBattery() {
        phone.Battery = 3500;
    }
 
    public override void BuildSpeaker() {
        phone.Speaker= "小米的揚聲器";
    }
 
    public override void BuildColor() {
        phone.Color= "小米的專屬顏色";
    }
}

public class MZ : Builder {
 
    public override void BuildCPU() {
        phone.Carframe = "魅族的處理器";
    }
 
    public override void BuildBattery() {
        phone.Battery = 2500;
    }
 
    public override void BuildSpeaker() {
        phone.Speaker= "魅族的揚聲器";
    }
 
    public override void BuildColor() {
        phone.Color= "魅族的專屬顏色";
    }
}

3.指導者Director


public class Director {
    public void Construct(Builder builder) {
        builder.BuildCPU();
        builder.BuildBattery();
        builder.BuildSpeaker();
        builder.BuildColor();
    }
}

4.一個擴充套件類

public static class Extentions {
 
    public static string VehicleInfo(this Vehicle vehicle) {
        var type = vehicle.GetType();
        var properties = type.GetProperties();
        var result = string.Empty;
        foreach (var prop in properties) {
            result +=
                $"{prop.Name}:{prop.GetValue(vehicle, null)}{Environment.NewLine}";
        }
        return result;
    }
}

5.呼叫方的程式碼,分別維持對指導者、建造者和手機的引用,接下來我們建立了3部手機。

public class Program {
 
    private static Director _director = null;
 
    private static List<Builder> _builders = null;
 
    private static Phone _phone = null;
 
    public static void Main(string[] args) {
        _director = new Director();
        _phone = new Phone ();
 
        _builders = new List<Builder>() {
            new HW(),
            new XM(),
            new MZ()
        };
 
        foreach (var builder in _builders) {
            _director.Construct(builder);
            _phone = builder.GetResult();
            _phone .Print();
        }
 
        Console.ReadKey();
    }
 
 }

      上面,我們介紹完了建造者模式的具體實現之後,最後讓我們總結下建造模式的實現要點:

1.在建造者模式中,指揮者是直接與客戶端打交道的,指揮者將客戶端建立產品的請求劃分為對各個部件的建造請求,再將這些請求委派到具體建造者角色,具體建造者角色是完成具體產品的構建工作的,卻不為客戶所知道。

2.。建造者模式主要用於“分步驟來構建一個複雜的物件”,其中“分步驟”是一個固定的組合過程,而複雜物件的各個部分是經常變化的(也就是說電腦的內部元件是經常變化的,這裡指的的變化如硬碟的大小變了,CPU由單核變雙核等)。

3.產品不需要抽象類,由於建造模式的創建出來的最終產品可能差異很大,所以不大可能提煉出一個抽象產品類。

4.在前面文章中介紹的抽象工廠模式解決了“系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化。

5.由於建造者隱藏了具體產品的組裝過程,所以要改變一個產品的內部表示,只需要再實現一個具體的建造者就可以了,從而能很好地應對產品組成元件的需求變化。