設計模式—建造者模式

參考:https://www.cnblogs.com/frank0812/p/11241935.html

1.什麼是建造者

2.建造者有什麼優勢

3.建造者有什麼劣勢

4.怎麼用建造者模式

建造者定義:在軟件開發中,有時我們要創建一個複雜的對象,這個對象由幾個子部件按一定的步驟組合而成,這時候我們就可以使用建造者模式了。說到建造者我們首先想到的是蓋房子,蓋房子簡單的說有三個步驟:打地基,砌磚,粉刷。我們就以蓋房子爲例解釋建造者模式的用法。(自我理解:使用時有時序的,並且時序比較穩定,並不是有無數種的,而是有限的幾種)

  建造者模式有三個角色:建造者,具體的建造者,監工。理清這三個角色的作用我們就可以愉快的使用建造者模式了。

  建造者:一般爲抽象類或接口,定義了建造者的功能。如蓋房子例子的建造者有打地基,砌磚和粉刷的功能。

  具體的建造者:實現了建造者的抽象方法(或接口)。不同的具體建造者生產的組件不同,如一個技術好的建造者打地基深,砌磚整齊,粉刷光滑,而技術差的建造者打地基淺,砌磚錯亂,粉刷粗糙。

  監工:制定建造的算法。建造者可以打地基,砌磚,粉刷,但是不知道先粉刷還是先打地基,監工就是給建造者制定蓋房子步驟的。

代碼實現如下,

using System;

namespace BuilderModel
{
    /// <summary>
    /// 建造房子
    /// </summary>
    public abstract class Builder
    {
        public abstract void builderFoundation();//第一步 先建造地基
        public abstract void builderHorse();//第二步 再建造房子
        public abstract void builderPaint();//第三步 粉刷房子
        public abstract void getHouse();//第四步獲取房子
    }

    public class GoodBuilder: Builder
    {
        public override void builderFoundation()
        {
            Console.WriteLine("建造一個好地基");
        }
        public override void builderHorse()
        {
            Console.WriteLine("建造一個好房子");
        }
        public override void builderPaint()
        {
            Console.WriteLine("好好粉刷房子");
        }
        public override void getHouse()
        {
            Console.WriteLine("獲得一個好房子");
        }
    }
    public class BadBuilder : Builder
    {
        public override void builderFoundation()
        {
            Console.WriteLine("隨便建造一個地基");
        }
        public override void builderHorse()
        {
            Console.WriteLine("隨便造一個房子");
        }
        public override void builderPaint()
        {
            Console.WriteLine("隨便粉刷一下");
        }
        public override void getHouse()
        {
            Console.WriteLine("獲得一個質量較差的房子");
        }
    }
    public class Adverice
    {
        private Builder builder = null;
        public Adverice(Builder builder)
        {
            this.builder = builder;
        }

        public void GetBuilder()
        {
            builder.builderFoundation();
            builder.builderHorse();
            builder.builderPaint();
          
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Builder goodBuilder = new GoodBuilder();
            Adverice adverice = new Adverice(goodBuilder);//將創建過程放在監工類中
            adverice.GetBuilder();
            goodBuilder.getHouse();
            Builder badBuilder = new BadBuilder();
            Adverice adverice1 = new Adverice(badBuilder);
            adverice1.GetBuilder();
            badBuilder.getHouse();

           
        }
    }
}

總結:

1.適用於流水線比較複雜創建方式 過程,相互獨立,易於擴展

2.當創建時序很多時,不適用

發佈了12 篇原創文章 · 獲贊 0 · 訪問量 719
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章