这节讲建造者模式(Builder Pattern)。
有些情况下,一个大类需要依赖另外一些小类共同完成一个需求,就好像一个完整的手机需要CPU,屏幕等小零件组成。
建造者模式就用来处理这个组成过程,它的定义为:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
建造者模式由两个类组成:建造类和指挥类,建造类负责提供具体建造方法,指挥类负责调用建造类中的方法完成实例的创建。下面看一个完整的代码:
代码语言:javascript复制//最终产品
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:n{CPU}n{Screen}n{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 ();
}
}
在主方法中建造对象:
代码语言:javascript复制ABuilder b = new BuilderMate ();
Commander comm = new Commander (b);
Mate m= comm.construct ();
Console.WriteLine (m.ToString ());
建造者模式的优点是封装性好,构建和表示分离。扩展性好,各个具体的建造者相互独立,有利于系统的解耦。客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
当然,建造者模式的缺点也是显而易见的,每个建造者类,只能服务这一种生产模式,另外如果产品自身发生变化,建造者类也要跟着做变化,后期的维护成本高。
建造者模式尽管跟共产模式都是用来创建对象,但建造者模式注重组装,而工厂模式注重创建。这两者可以结合起来使用,使用工厂模式创建零部件,使用建造者模式组装最后的产品。
本节到此结束...