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

    这节讲建造者模式(Builder Pattern)。

    有些情况下,一个大类需要依赖另外一些小类共同完成一个需求,就好像一个完整的手机需要CPU,屏幕等小零件组成。

    建造者模式就用来处理这个组成过程,它的定义为:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

    建造者模式由两个类组成:建造类和指挥类,建造类负责提供具体建造方法,指挥类负责调用建造类中的方法完成实例的创建。下面看一个完整的代码:

    //最终产品
    class Mate
    {
        public string CPU { get; set; }
        public string Screen { get; set; }
        public string System { get; set; }
    ​
        public void LoadCPU(string cpu)
        {
            this.CPU = cpu;
        }
        
        public void LoadScreen(string scr)
        {
            this.Screen = scr;
        }
    ​
        public void LoadSystem(string sys)
        {
            this.System = sys;
        }
    ​
        public override string ToString ()
        {
            return $"Mate Stats:
    {CPU}
    {Screen}
    {System}";
        }
    }
    ​
    //抽象建造者
    abstract class ABuilder
    {
        protected Mate mate = new Mate ();
    ​
        public abstract void BuildCPU ();
        public abstract void BuildScreen ();
        public abstract void BuildSystem ();
    ​
        public Mate Products () => mate;
    ​
    }
    ​
    //具体建造者
    class BuilderMate : ABuilder
    {
        public override void BuildCPU ()
        {
            mate.LoadCPU ("CPU--就位");
        }
    ​
        public override void BuildScreen ()
        {
            mate.LoadScreen ("屏幕--就位");
        }
    ​
        public override void BuildSystem ()
        {
            mate.LoadSystem ("系统--就位");
        }
    }
    ​
    //指挥者
    class Commander
    {
        ABuilder bm = null;
        public Commander (ABuilder bm)
        {
            this.bm = bm;
        }
    ​
        //组装,出品
        public Mate construct ()
        {
            bm.BuildCPU ();
            bm.BuildScreen ();
            bm.BuildSystem ();
            return bm.Products ();
        }
    }

    在主方法中建造对象:

    ABuilder b = new BuilderMate ();
    Commander comm = new Commander (b);
    Mate m= comm.construct ();
    Console.WriteLine (m.ToString ());

    建造者模式的优点是封装性好,构建和表示分离。扩展性好,各个具体的建造者相互独立,有利于系统的解耦。客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。

    当然,建造者模式的缺点也是显而易见的,每个建造者类,只能服务这一种生产模式,另外如果产品自身发生变化,建造者类也要跟着做变化,后期的维护成本高。

    建造者模式尽管跟共产模式都是用来创建对象,但建造者模式注重组装,而工厂模式注重创建。这两者可以结合起来使用,使用工厂模式创建零部件,使用建造者模式组装最后的产品。

     个人公众号,热爱分享,知识无价。

  • 相关阅读:
    看所访问网站的IP
    FLEX是什么及与FLASH的关系的介绍
    [设计模式]Head First Design Patterns[转]
    ASP.NET 2.0移动开发入门之使用模拟器
    在一篇文章的基础上总结了一下(接口,组合,继承,组件)
    抽象类与接口的区别 Java描述(转)
    C#:代表(delegate)和事件(event) (转)
    C#分页控件(自己做的)
    一个站点控制另一个站点的文件(添加,删除)用Webservices
    .net remoting程序开发入门篇
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13813804.html
Copyright © 2011-2022 走看看