zoukankan      html  css  js  c++  java
  • 建造者模式 Builder---Design Pattern 3

    建造者模式 Builder

    建造者模式:将一个复杂对象的构建于它的表示分离,使得同样的构建过程可以创建不同的表示。  

    建造者模式解决的是 “产品部分” 的需求变化问题,而抽象工厂模式解决的是“系列产品”的需求变化问题。

        //目标复杂对象的实体类
        public class Transformers
        {
            public string TransName { get; set; }   //名称
            private List<string> allParts = new List<string>(); //组成部分
            public void AssemblePart(string part)   //组装
            {
                allParts.Add(part);
            }
            public void ShowTime()  //展示
            {
                Console.WriteLine("变形金刚开始变形……");
                foreach (var part in allParts)
                {
                    Console.WriteLine("模块【" + part + "】组合完成…");
                }
                Console.WriteLine("I am " + TransName + " !");
                Console.WriteLine("变形金刚变形完毕!
    ");
            }
        }
        //封装了建造各部分模块功能的抽象类
        public abstract class BuilderTrans
        {
            public abstract void BuildHead();   //建造模块1的功能
            public abstract void BuildBody();   //建造模块2的功能
            public abstract void BuildHand();   //建造模块3的功能
            public abstract void BuildFoot();   //建造模块4的功能
            public abstract void SetTransName();    //建造模块5的功能
            public abstract Transformers GetResult();   //返回复杂对象整体
        }
        //原来的需求
        public class BuilderTrans1 : BuilderTrans
        {
            Transformers trans1 = new Transformers();
            public override void SetTransName()
            {
                trans1.TransName = "擎天柱";
            }
            public override void BuildHead()
            {
                trans1.AssemblePart("擎天柱头部");
            }
            public override void BuildBody()
            {
                trans1.AssemblePart("擎天柱躯干");
            }
            public override void BuildHand()
            {
                trans1.AssemblePart("擎天柱双手");
            }
            public override void BuildFoot()
            {
                trans1.AssemblePart("擎天柱双脚");
            }
            public override Transformers GetResult()
            {
                return trans1;
            }
        }
        //新增的需求
        public class BuilderTrans2 : BuilderTrans
        {
            Transformers trans2 = new Transformers();
            public override void SetTransName()
            {
                trans2.TransName = "大黄蜂";
            }
            public override void BuildHead()
            {
                trans2.AssemblePart("大黄蜂头部");
            }
            public override void BuildBody()
            {
                trans2.AssemblePart("大黄蜂躯干");
            }
            public override void BuildHand()
            {
                trans2.AssemblePart("大黄蜂双手");
            }
            public override void BuildFoot()
            {
                trans2.AssemblePart("大黄蜂双脚");
            }
            public override Transformers GetResult()
            {
                return trans2;
            }
        }
        //让具体建造者开始生产各模块的实体类
        public class BossCommand
        {
            public void BeginTrans(BuilderTrans builder)    //调用建造者生产各个模块
            {
                builder.BuildHead();    //建造模块1
                builder.BuildBody();    //建造模块2
                builder.BuildHand();    //建造模块3
                builder.BuildFoot();    //建造模块4
                builder.SetTransName(); //建造模块5
            }
        }
        //程序调用入口(Main方法)
        class Program
        {
            static void Main(string[] args)
            {
                BossCommand command = new BossCommand();    //实例化准备对所有建造者下达命令
                //原来的需求
                BuilderTrans builderTrans1 = new BuilderTrans1();   //实例化专门的建造者
                command.BeginTrans(builderTrans1);  //受命建造各模块,若省略则结果只是没有各模块的“空壳”。
                builderTrans1.GetResult().ShowTime();   //建造者返回建造结果并展示
                //新增的需求
                BuilderTrans builderTrans2 = new BuilderTrans2();
                command.BeginTrans(builderTrans2);
                builderTrans2.GetResult().ShowTime();
                Console.ReadKey();
            }
        }
    

    由于建造者封装(隐藏)了具体产品(模块)的创建/组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。

  • 相关阅读:
    pandas模块
    27.mysql数据库之约束
    nump模块
    26.mysql数据库基础
    24.IO模型
    23.并发编程之协程
    第五十三篇 并发编程之多进程续
    第五十二篇 操作系统简史——多道技术
    第五十一篇 并发编程——多进程
    第四十九篇 socket套接字编程
  • 原文地址:https://www.cnblogs.com/wangweiabcd/p/3906992.html
Copyright © 2011-2022 走看看