C# 設計模式——生成器模式(建造者模式)、適配器模式

1、生成器模式

      我們知道工廠模式能夠根據傳遞給構造方法返回幾個不同子類中的一個,假設我們不但需要一個用於計算的算法,還要根據顯示的數據不通而現實不同的界面,我們就知道改如何使用生成器模式(Builder Pattern)。生成器模式將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示我們用個栗子看看。還是造車。

/// <summary>
/// 造車步驟
/// </summary>
public abstract class Builder
{
    /// <summary>
    /// 造輪子
    /// </summary>
    public abstract void MakeWheels();
    /// <summary>
    /// 組裝
    /// </summary>
    public abstract void Assemble();
    /// <summary>
    /// 噴漆
    /// </summary>
    public abstract void Painting();
}

     再寫一個造大車跟造小車的類

/// <summary>
/// 造大車
/// </summary>
public class BigBuilder : Builder
{
    public override void Assemble()
    {
        Console.WriteLine("大車組裝完成啦");
    }

    public override void MakeWheels()
    {
        Console.WriteLine("大車輪子造好啦!");
    }

    public override void Painting()
    {
        Console.WriteLine("大車噴漆完成!");
    }
}
/// <summary>
/// 造小車
/// </summary>
public class SmallBuilder : Builder
{
    public override void Assemble()
    {
        Console.WriteLine("小車組裝完成啦");
    }

    public override void MakeWheels()
    {
        Console.WriteLine("小車輪子造好啦!");
    }

    public override void Painting()
    {
        Console.WriteLine("小車噴漆完成!");
    }
}

     後面加一個工廠 造車的。它使用Builder來創建不同種類的汽車

/// <summary>
/// 造車工廠
/// </summary>
public class CarFactory
{
    public Builder Builder { get; set; }
    public CarFactory(Builder builder)
    {
        Builder=builder;
    }
    /// <summary>
    /// 造車
    /// </summary>
    public void CreateCar()
    {
        Builder.MakeWheels();//輪子
        Builder.Assemble();//組裝
        Builder.Painting();//噴漆
    }
    

}

//客戶端調用
CarFactory cf = new(new BigBuilder());
cf.CreateCar();
cf.Builder = new SmallBuilder();
cf.CreateCar();

     所以可以看出生成器模式的好處:

    允許讀者改變產品內部表示,同事也影藏了產品如何裝的問題;

    每個特定的生成器都獨立於其他的生成器,同事獨立於程序的其他部分。所以能精確的控制生成器構建的結果;

    生成器的模式類似於抽象工廠模式,兩者都返回了相同的方法個對象組成的類。他們之間主要的差別是抽象工廠返回一一系列相關的類而生成器是根據它提供的數據一步一步的構建出一個複雜的對象。 

  建造者模式的缺點:

    當組件的組合種類很多時,需要創建很多的具體建造者類。

2、適配器模式

       適配器模式(Adapter  Pattern)可以將一個程序設計接口轉換爲另外一個接口。當我們想讓不相關的類在同一個程序裏面一起工作的時候就可以用適配器的模式。一是繼承可以實現,從一個不一致的類派生出一個新類添加需要的方法讓派生類滿足所需要的接口;二是對象組合,就是把原始類包含在新類裏面,然後再新類裏面創建方法轉換調用。這兩種方法統稱爲類適配器和對象適配器。說着有點指鹿爲馬的感覺了(程序中就是這樣的)。這裏有三個角色。

   初始角色:我們需要的功能,但是接口不匹配;

   目標角色:他就表現了客戶需要的接口

   適配器覺得:實現了目標接口

   舉個栗子 我是蘋果手機想充錢,但是我只有安卓的充電線,這時候是不是就要找一個轉接頭來我們也可以充電了。

/// <summary>
/// 安卓充電
/// </summary>
public class Android
{
    public void AndroidCharge()
    {
        Console.WriteLine("安卓充電");
    }
}
/// <summary>
/// 蘋果接口充電
/// </summary>
public interface IApple
{
    /// <summary>
    /// 目標方法
    /// </summary>
    void AppleChage();
}
public class AppleAdater : IApple
{
    Android ad = new Android();
    /// <summary>
    /// 評估充電,實際上是調用安卓的充電方法
    /// </summary>
    public void AppleChage()
    {
        ad.AndroidCharge();
    }
}

//客戶端調用
IApple app = new AppleAdater();
app.AppleChage();

適配器模式的優點:

  1.提高代碼複用,複用了Adaptee中的方法

  2.靈活性好,如沒有關聯的兩個類A和類B,類A想借用類B的方法,可以在類A中添加一個類B的實例,然後調用類B實例的方法即可。

適配器模式的缺點:

  1.過多使用適配器會讓會同凌亂,如我們明明調用的是A接口的功能,但是卻被適配成了B接口的功能。

 

PS:每個人都應該把自己的每一天當成一場自我的創作,在這創作中誠實的體現自己,而且把這一天當作是一個無法重複的一天,抱持着不能複製的心情過好這一天。

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