zoukankan      html  css  js  c++  java
  • 建造者模式

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

    官方释义:建造者模式(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

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

    参考自<大话设计模式>

  • 相关阅读:
    USACO 之 Section 2.2 (已解决)
    USACO 之 Section 2.1 (已解决)
    《C++ Primer》学习 之 函数指针相关用法
    《C++ Primer》学习 之 const_cast使用
    《C++ Primer》学习 之 返回数组的引用(返回数组的指针,方法与之相同)
    USACO 之 Section 1.5 (已解决)
    USACO 之 Section 1.4 More Search Techniques (已解决)
    [NN] 对于BackPropagation(BP, 误差反向传播)的一些理解
    [CLPR] 定位算法探幽
    [LeetCode系列] 双单链表共同节点搜索问题
  • 原文地址:https://www.cnblogs.com/baweier2013/p/5011469.html
Copyright © 2011-2022 走看看