• 建造者模式


    今天复习了下建造者模式,总结下

    官方释义:建造者模式(Builder),将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示

    对于复杂对象的创建,如果其创建过程是稳定的,但内部表现却有不同形式(比如,建造一个人,都有头、身体、左臂右臂、左腿右腿四部分,但表现形式却不同:瘦人、胖人、高人、矮人等),这就可以考虑使用建造模式:将建造过程抽象出来,具体建造过程基于抽象的建造过程就不会丢掉某一建造步骤,而客户端只需调用指挥者类、传入具体表现形式(瘦人、胖人、高人...),至于具体的建造细节客户端无需关注:你要胖人,我返回给你胖人,要瘦人我返回给你具体的瘦人,怎样造的?你不会关心

    事例代码:

    1.产品类:即要构建的具体产品

     1 /// <summary>
     2     /// 产品类
     3     /// </summary>
     4     class Product
     5     {
     6         //产品的多个部件
     7         IList<string> parts = new List<string>();
     8 
     9         //添加产品部件方法
    10         public void Add(string part)
    11         {
    12             parts.Add(part);
    13         }
    14 
    15         /// <summary>
    16         /// 展示产品部件
    17         /// </summary>
    18         public void Display()
    19         {
    20             foreach (string part in parts)
    21             {
    22                 Console.WriteLine(part);
    23             }
    24         }
    View Code

    2.抽象构建者类:定义好具体构建过程

     1 /// <summary>
     2     /// 抽象建造类:控制建造过程(避免丢掉建造步骤)
     3     /// </summary>
     4     abstract class Builder
     5     {
     6         //假定该建造过程分两步:A,B
     7         public abstract void BuildPartA();
     8         public abstract void BuildPartB();
     9         //建造完成,得到产品
    10         public abstract Product GetProduct();
    11     }
    View Code

    3.具体构建者:继承自抽象构建者,保证了构建过程的稳定

     1 /// <summary>
     2     /// 具体建造者1
     3     /// </summary>
     4     class ConcreteBuilder1:Builder
     5     {
     6         Product product = new Product();
     7 
     8         public override void BuildPartA()
     9         {
    10             product.Add("部件A");
    11         }
    12 
    13         public override void BuildPartB()
    14         {
    15             product.Add("部件B");
    16         }
    17 
    18         public override Product GetProduct()
    19         {
    20             return product;
    21         }
    View Code
     1 /// <summary>
     2     /// 具体建造者2
     3     /// </summary>
     4     class ConcreteBuilder2 : Builder
     5     {
     6         Product product = new Product();
     7 
     8         public override void BuildPartA()
     9         {
    10             product.Add("部件X");
    11         }
    12 
    13         public override void BuildPartB()
    14         {
    15             product.Add("部件Y");
    16         }
    17 
    18         public override Product GetProduct()
    19         {
    20             return product;
    21         }
    22     }
    View Code

    4.很重要的类:指挥者类,客户端直接引用,根据客户的意图创建具体产品

     1 /// <summary>
     2     /// 指挥者类:根据用户需求,建造不同产品(过程是稳定的,都是A,B两步)
     3     /// </summary>
     4     class Director
     5     {
     6         public void Build(Builder builder)
     7         {
     8             builder.BuildPartA();
     9             builder.BuildPartB();
    10         }
    11     }
    View Code

    5.客户端调用:

     1  static void Main(string[] args)
     2         {
     3             //创建指挥者
     4             Director director = new Director();
     5             Builder concreteBuilder1=new ConcreteBuilder1();
     6             Builder concreteBuilder2 = new ConcreteBuilder2();
     7 
     8             //指挥创建具体产品1
     9             director.Build(concreteBuilder1);
    10             Product p1 = concreteBuilder1.GetProduct();
    11             p1.Display();
    12 
    13             //指挥创建具体产品2
    14             director.Build(concreteBuilder2);
    15             Product p2 = concreteBuilder2.GetProduct();
    16             p2.Display();
    17 
    18             Console.Read();
    19         }
    View Code

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

    参考自<大话设计模式>

  • 相关阅读:
    MySQL 处理重复数据
    MySQL 序列使用
    MySQL 元数据
    MySQL 临时表和复制表
    MySQL 索引
    MySQL ALTER命令-修改数据表名或者修改数据表字段
    MySQL 事务
    MySQL 正则表达式
    MySQL NULL 值处理
    MySQL 排序
  • 原文地址:https://www.cnblogs.com/baweier2013/p/5011469.html
Copyright © 2020-2023  润新知