设计模式---建造者模式
2014-11-05 21:43 周信达 阅读(187) 评论(0) 编辑 收藏 举报前言
同设计模式系列上篇设计模式---抽象工厂一样,建造者模式也属于创建型模式,用于在使用者和产品之间加入中间代理,使用中间代理进行实现具体创建细节。让我再简单回顾一下抽象工厂,使用者依赖于抽象工厂构建抽象产品,具体产品的实现细节可以在具体工厂中进行创建
那么问题来了
可以想象,既然是工厂,那应该是一个比较大粒度的接口层了。现在的情况是,如果在具体工厂中生产产品时,加入生产具体产品的环节很多,一个产品可能要经过Step1、Step2、Step3等多个步骤完成,那么,在不影响工厂的接口之下,我们是否能对具体工厂的实现细节来做良好的设计呢?OK,这就是本篇要讲的主题了。建造者模式在上层和工厂的接口很相似,都是提供抽象创建接口和抽象产品。但是请注意,我理解的建造者模式是在更细粒度的控制上,针对具体产品实现进行细分。请看详细分解
UML图解
且听我分解:
- 产品类,提供产品定义
- 抽象建造者,负责提供建造方法抽象接口,此接口可以为带参数的泛型接口,或者提供多个建造方法接口
- 具体建造者,负责实现抽象建造方法接口,对产品进行装饰
- 装配者,这里的Director我称为装配者,它拥有建造者抽象接口,在装配方法中调用建造者接口的建造方法对产品进行构造,这里的作用就是可以自由组合不同的建造方法和顺序,所以这个过程我把它称为装配的过程
代码
产品定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Product { public string Part1 { get ; set ; } public string Part2 { get ; set ; } public string Part3 { get ; set ; } public override string ToString() { return "Part1: " + Part1 + Environment.NewLine + "Part2: " + Part2 + Environment.NewLine + "Part3: " + Part3; } } |
抽象建造者
1 2 3 4 5 6 7 8 | public abstract class ProductBuilder { public abstract void BuildStep1(); public abstract void BuildStep2(); public abstract void BuildStep3(); public abstract Product GetProduct(); } |
具体建造者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class ConcreteBuilder : ProductBuilder { private Product product = new Product(); public override void BuildStep1() { product.Part1 = "Step1 Finished" ; } public override void BuildStep2() { product.Part2 = "Step2 Finished" ; } public override void BuildStep3() { product.Part3 = "Step3 Finished" ; } public override Product GetProduct() { return product; } } |
装配者Director
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Director { private ProductBuilder builder = new ConcreteBuilder(); public Product Assemble() { builder.BuildStep1(); builder.BuildStep2(); builder.BuildStep3(); return builder.GetProduct(); } } |
输出
1 2 3 4 5 6 7 8 | static void Main( string [] args) { Director director = new Director(); Product p = director.Assemble(); Console.WriteLine(p); Console.ReadKey(); } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步