建造者模式

上一回,学习李建忠讲的设计模式 建造者模式 这次又找出大话模式的书

两者作一对比,找出一些由象入理的学习点,以方便下次有场景的时候

可以想到,从这些方面入手,也就是培养思考意识

刚翻看大话设计模式

建造者模式的适用原则:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品

抽象的方法,约束实现者必须实现,面向抽象编程的过程,可以把一些流程给固定下来,以免有漏

下面是大话模式建造者模式,创建游戏人物的UML图(UML主要设计的时候用,来表现作者的思想,和解决问题的思路)

 

 

解决的问题:

指挥者 是指挥 Builder 构建者 构建对象的

为什么要有指挥者,

第一屏蔽客户端与构建者之间的直接关联,将客户端与构建者通过指挥者来隔离开来

第二保证调用构建者创造的产品是稳定且是完整的

为什么要有构建者

第一构建者面向抽象,与指挥者配合,使得构建过程依赖于抽象Builder而不依赖具体构建的产品

第二构建者通过抽象方法,来约束子类,必须要做的事情,可以避免原来子类直接创建操作

缺少流程和环节的情况

构建者是做什么用,什么情况下要用呢

当调用端需要对象,而不需要关注具体实现的细节,解决高耦合

以下为建造者模式源示例代码

 构建者

public  abstract  class Bulider
    {
      public abstract void BuliderA();
      public abstract void BuliderB();
      public abstract Product GetResult();
    }

具体构建者

class ProductBuilder:Bulider
    {
        private Product pro = new Product();
        public override void BuliderA()
        {
            pro.add("第一部分");
        }

        public override void BuliderB()
        {
            pro.add("第二部分");
        }

        public override Product GetResult()
        {
            return pro;
        }
    }

指挥者

 public  class Director
    {
        public void construct(Bulider bui)
        {
            bui.BuliderA();
            bui.BuliderB();
        }   

    }

产品

public  class Product
    {
        IList<string> Ilis = new List<string>();
        public void add(string part)
        {
            Ilis.Add(part);
 
        }
        public void show()
        {
            Console.WriteLine("开始创建产品");
            foreach(string str in Ilis)
            {
                Console.WriteLine(str);

            }

        }
    }

调用者

 static void Main(string[] args)
        {
            /*将一个对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示意图
            如果我们用了建造者模式*/
            // yaoyu_cn@163.com;
            //18611113382

            //建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分及他们的装配模式时使用    

            Director Guid = new Director();
            Bulider g1 = new ProductBuilder();
            Guid.construct(g1);
            Product pr = g1.GetResult();
            pr.show();
            Console.ReadLine();

        }
原文地址:https://www.cnblogs.com/gdnyfcuso/p/6671448.html