博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
建造者模式
阅读量:6676 次
发布时间:2019-06-25

本文共 3432 字,大约阅读时间需要 11 分钟。

在软件开发中,也会存在一些构造非常复杂的对象,这些对象拥有一系列的成员属性,这些成员属性有些是基本数据类型,有些是引用类型,总之就是一句话,这个对象的构建比较复杂。在这里我们就将复杂对象当做汽车,成员属性当做部件,对象的构建当做汽车的组合。对于用户而言我们总是希望我们在使用对象时足够简单,如果一个复杂的对象直接丢给用户,用户会是痛苦不堪的(给你一堆部件,你来组装成一辆汽车看看),除了这个构建的过程外,可能用户会忘记某些成员属性。所以我们就希望能够像使用汽车一样使用复杂的对象:直接告诉你我需要的对象名或者对象类型,你返回一个完成的对象实例给我。建造者返回给客户一个完整的的产品对象,而客户端无须关心该对象所包含的额属性和组建方式,这就是建造者模式的设计动机。

建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式构建复杂对象就像造汽车一样,是一个一个组件一个一个步骤创建出来的,它允许用户通过制定的对象类型和内容来创建他们,但是用户并不需要知道这个复杂对象是如何构建的,它只需要明白通过这样做我可以得到一个完整的复杂对象实例。
在这里插入图片描述在这里插入图片描述
建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化
产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或者此模式应用于产品的生成过程,其最终结果可能差异很大,不大可能提炼出一个抽象产品类。

前面的抽象工厂模式解决“系列对象”的需求变化,Builder 模式解决“对象部分”的需求变化。

建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节

每一个Builder都相对独立,而与其它的Builder无关。

建造者模式适用于需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。需要生成的产品对象有复杂的内部结构

建造者模式使得建造代码与表示代码的分离,可以使客户端不必知道产品内部组成的细节,从而降低了客户端与具体产品之间的耦合度。

namespace 建造者模式{    class Program    {        static void Main(string[] args)        {            Director director = new Director();            ConcreteBuilder1 builder1=new ConcreteBuilder1();            ConcreteBuilder2 builder2=new ConcreteBuilder2();            director.Construct(builder2);            Computer computer=builder2.GetComputer();            computer.show();            Console.ReadKey();        }    }    ///     /// 具体产品 电脑类     ///     public class Computer    {        //电脑组件集合        public List
parts=null; public Computer() { parts=new List
(); } //添加组件 public void Add(string part) { parts.Add(part); } public void show() { Console.WriteLine("开始组装"); foreach (string temp in parts) { Console.WriteLine("组件"+temp.ToString()+"已经组装好"); } Console.WriteLine("电脑组装好了"); } } ///
/// 抽象建造者类扮演建造者角色,为创建具体产品的具体建造者提供接口 /// public abstract class Builder { // 装CPU public abstract void BuildCPU(); // 装主板 public abstract void BuildMainBoart(); // 获得组装好的电脑 public abstract Computer GetComputer(); } ///
/// 具体创建者,具体的某个人为具体创建者 /// public class ConcreteBuilder1 : Builder { Computer computer=new Computer(); public override void BuildCPU() { computer.parts.Add("CPU1"); } public override void BuildMainBoart() { computer.parts.Add("MainBoart1"); } public override Computer GetComputer() { return computer; } } ///
/// 具体创建者,具体的某个人为具体创建者 /// public class ConcreteBuilder2: Builder { Computer computer = new Computer(); public override void BuildCPU() { computer.parts.Add("CPU2"); } public override void BuildMainBoart() { computer.parts.Add("MainBoart2"); } public override Computer GetComputer() { return computer; } } ///
/// 建造者模式中的指挥者指挥创建过程类 /// public class Director { // 指挥builder组装电脑 public void Construct(Builder builder) { builder.BuildCPU(); builder.BuildMainBoart(); } }}

转载地址:http://dcrxo.baihongyu.com/

你可能感兴趣的文章
Android SDK:构建一个购物中心搜索的应用(二)-Points of Interest
查看>>
通过TFTP服务器拷贝路由器的配置文件到本地
查看>>
南方电网广东公司荣获“IT用户最佳实践案例奖”
查看>>
Yesod - 数据库 (9)
查看>>
redis多数据库
查看>>
RHCE认证培训+考试七天实录(五)
查看>>
ip nat translation (timeout)
查看>>
创建外网 ext_net - 每天5分钟玩转 OpenStack(104)
查看>>
api数据分页的两种方式的比较
查看>>
Python OpenCV学习笔记之:图像直方图反向投影
查看>>
布隆过滤器:实现代码
查看>>
使用Spring MVC开发RESTful API
查看>>
js复制input到剪切板(ie内核浏览器)单个input简洁版
查看>>
mysql.sock丢失解决
查看>>
BISO
查看>>
好程序员分享http的keep-alive和tcp的keep-alive区别
查看>>
tomcat调优方案
查看>>
Cisco2950 2960 交换机基本配置命令
查看>>
IE打印控件
查看>>
Java简单实现固定长度队列
查看>>