设计模式之建造者模式

这节讲建造者模式(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 ());

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

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

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

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

原文地址:https://www.cnblogs.com/charlesmvp/p/13813804.html