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

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

设计模式之五:建造者模式
http://www.taidous.com/thread-49124-1-1.html

(出处: 【泰斗社区】-专注互联网游戏和应用的开发者平台)

       建造者模式(Builder Pattern)也叫生成器模式:
      定义:Separate the construction of a complex object from its representation so that the same construction process 
can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示)
      建造者模式通常包括以下几个角色:
     1、Builder : 给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建;
     2、ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。在建造过程完成后,
提供产品的实例。
     3、Director: 调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建
     4、Product:要创建的复杂对象。

   优点:
     1、将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,使得我们能够更加精确的控制复杂对象的产生过程
     2、将产品的创建过程与产品本身分离出来,可以使用相同的创建过程来得到不同的产品。也就是说细节依赖抽象
     3、每一个具体创建者都相对独立,而与其他的具体创建建造者无关,因此可以很方便的替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
      缺点:
       1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制;
       2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者来实现这种变化,导致系统变得很庞大。
     使用场景:
     1、相同的方法,不同的执行顺序,产生不同的事件结果时,可采用此模式
     2、多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式
     3、产品类结构复杂,或者产品类中的调用顺序不同产生了不同的效能,可使用该模式

实现

///     /// 产品类    ///     public class Product    {        public void DoSomething()        {            //独立业务处理        }    }    ///     /// 抽象建造者    ///     public abstract class Builder    {        //设置产品的不同部分,以获得不同的产品        public abstract void SetPart();        //建造产品        public abstract Product BuildProduct();             }     ///     /// 具体建造者    ///     public class ConcreateProduct : Builder    {        private Product product = new Product();         public void SetPart()        {            //产品内部逻辑处理        }        //组建一个产品        public Product BuildProduct()        {            return product;        }    }    ///     /// 导演类    ///     public class Director    {        private Builder builder = new ConcreateProduct();        public Product GetAProduct()        {            builder.SetPart();            /*             * 设置不同的零件,产生不同产品              */            return builder.BuildProduct();        }    }

你可能感兴趣的文章
队列和栈的本质区别
查看>>
matlab中inline的用法
查看>>
如何用matlab求函数的最值?
查看>>
Git从入门到放弃
查看>>
java8采用stream对集合的常用操作
查看>>
EasySwift/YXJOnePixelLine 极其方便的画出真正的一个像素的线
查看>>
Ubuntu系统上安装Nginx服务器的简单方法
查看>>
Ubuntu Linux系统下apt-get命令详解
查看>>
ubuntu 16.04 下重置 MySQL 5.7 的密码(忘记密码)
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
HTTPS那些事 用java实现HTTPS工作原理
查看>>
oracle函数trunc的使用
查看>>
MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
查看>>
java反编译
查看>>
Class.forName( )你搞懂了吗?——转
查看>>
jarFile
查看>>
EJB3.0定时发送jms(发布/定阅)方式
查看>>
EJB与JAVA BEAN_J2EE的异步消息机制
查看>>
数学等于号是=那三个横杠是什么符
查看>>
HTTP协议详解
查看>>