创建模式(二)
Singleton(单态)
确保每个类只有一个实例,并提供它的全局访问点
个人认为这是个最简单的模式,一般在以下情况下使用
当一个类只能有一个实例,而且用户可以从一个众所周知的访问点访问它时,如非共享资源
Singleton的结构图很简单,就是一个类图
但这是一个特殊的类
1、私有的构造器
2、所有的域都是私有的
3、只有一个公有方法
1和2是为了确保 “每个类只有一个实例”,而3则是提供它的全局访问
除上术实现形式外 ,还可以用synchronized(传说中的lazy initialization)
大家查看代码查找区别:
Builder
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构 成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制” 来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。
使用情况
1、需要生成的产品对象有复杂的内部结构。如果很简单的话,那么使用这个模式可能就没有必要了。
2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
主要参与者:
Builder建造
Director负责实现
ConcreateBuilder建造
Product实际要构建的产品,Client最终使用Product 的部分
要点
1、各部分分工职权明确,比如
Director负责监督 Builder构建并得到最后的产品
Client只能从Director处拿到 产品,不管你的生产过程
Builder生产并于Director
2、实现的是复杂产品(单个) 的生产过程
与工厂模式的区别:
工厂模式主要是涉及到产品的创建,并且产品只有极其简单的构建过程或者根本就不需要额外的构建。
而Builder模式则恰恰相反,它主要构建有复杂的构建过程的产品。
工厂模式一般涉及多个产品的创建,而builder模式只负责创建一个产品。
Prototype(原型)
通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。
在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它却拥有比较稳定一致的接口。如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变。
Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
使用情况:
(主要的不容易产类的对象)
1、对象的构建十分复杂
2、 对象 经常面临着剧烈的变化
主要参与者:
Prototype(原型)
具体形式
Client使用者
要点
1、解决如何clone的问题
2、统一一个原型很重要