• 深入设计模式(四)——建造者模式


    一、建造者模式介绍

      建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。

      建造者模式的优点是:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

    二、解决实际问题

        主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。

    三、生活中的例子

        建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。这种模式用于快餐店制作儿童餐。典型的儿童餐包括一个主食,一个辅 食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。无论顾客点的是汉堡,三 名治还是鸡肉,过程都是一样的。柜台的员工直接把主食,辅食和玩具放在一起。这些是放在一个袋子中的。饮料被倒入杯中,放在袋子外边。这些过程在相互竞争 的餐馆中是同样的。

    四、建造者模式分析

      1.建造者结构图

           

          2.代码

            

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace 建造者模式
     8 {
     9    public class Product
    10     {
    11        private IList<string> parts = new List<string>();
    12 
    13        public void Add(string part) {
    14            parts.Add(part);
    15        }
    16 
    17        public void Show() {
    18            Console.WriteLine("产品开始创建.....");
    19            foreach (string part in parts)
    20            {
    21                Console.WriteLine("部件"+part);
    22            }
    23            Console.WriteLine("产品完成创建");
    24        }
    25     }
    26 }
    1、具体产品Product
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace 建造者模式
     8 {
     9    public abstract class Builder
    10     {
    11        public abstract void BuildPartA();
    12        public abstract void BuildPartB();
    13        public abstract Product GetResult();
    14     }
    15 
    16 }
    2.建造者Builder
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace 建造者模式
     8 {
     9    public class ConcreteBuilder1 : Builder
    10     {
    11        Product product = new Product();
    12         public override void BuildPartA()
    13         {
    14             product.Add("A1");
    15         }
    16 
    17         public override void BuildPartB()
    18         {
    19             product.Add("B1");
    20         }
    21 
    22         public override Product GetResult()
    23         {
    24             return product;
    25         }
    26     }
    27 }
    3.具体建造者ConcreteBuilder1
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace 建造者模式
     8 {
     9    public class ConcreteBuilder2:Builder
    10     {
    11        Product product = new Product();
    12         public override void BuildPartA()
    13         {
    14             product.Add("A2");
    15         }
    16 
    17         public override void BuildPartB()
    18         {
    19             product.Add("B2");
    20         }
    21 
    22         public override Product GetResult()
    23         {
    24             return product;
    25         }
    26     }
    27 }
    4.具体建造者ConcreteBuilder1
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace 建造者模式
     8 {
     9     /// <summary>
    10     /// 指挥建造过程
    11     /// </summary>
    12    public class Director
    13     {
    14        public void Construct(Builder builder) {
    15            builder.BuildPartA();
    16            builder.BuildPartB();
    17        }
    18     }
    19 }
    5. 指挥者类Director
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace 建造者模式
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             Director director = new Director();
    14             Builder builder1 = new ConcreteBuilder1();
    15             Builder builder2 = new ConcreteBuilder2();
    16 
    17             director.Construct(builder1);
    18             Product product1 = builder1.GetResult();
    19             product1.Show();
    20 
    21             director.Construct(builder2);
    22             Product product2 = builder2.GetResult();
    23             product2.Show();
    24             Console.Read();
    25         }
    26     }
    27 }
    6.客户端代码
  • 相关阅读:
    关于prototype属性的理解
    关于js中原型链的理解
    关于焦点轮播图的优化
    两个动画函数的分析
    JavaScript 实用技巧和写法建议
    Vue SPA 首屏加载优化实践
    带你优雅的使用 icon
    前端本地文件操作与上传
    学习webpack
    Vue 脱坑记
  • 原文地址:https://www.cnblogs.com/xiaowuzi/p/3436495.html
Copyright © 2020-2023  润新知