这节讲建造者模式(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 ());
建造者模式的优点是封装性好,构建和表示分离。扩展性好,各个具体的建造者相互独立,有利于系统的解耦。客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
当然,建造者模式的缺点也是显而易见的,每个建造者类,只能服务这一种生产模式,另外如果产品自身发生变化,建造者类也要跟着做变化,后期的维护成本高。
建造者模式尽管跟共产模式都是用来创建对象,但建造者模式注重组装,而工厂模式注重创建。这两者可以结合起来使用,使用工厂模式创建零部件,使用建造者模式组装最后的产品。
个人公众号,热爱分享,知识无价。