当前位置:文档之家› 设计模式——06原型模式、单例模式与建造者模式

设计模式——06原型模式、单例模式与建造者模式


原型模式(续)
模式结构
Client
+ operation () prototype
Prototype
+ clone () : Prototype
p=prototype.clone();
ConcretePrototypeA
+ clone () : Prototype
ConcretePrototypeB
MotorBuilder
<<Constructor>> <<Override>> <<Override>> <<Override>> <<Override>> MotorBuilder () buildFrame () buildEngine () buildWheels () buildDoors ()
原型模式(续)
模式解释 深克隆与浅克隆
原型模式(续)
实例分析 实例一:孙悟空变身(浅克隆)
<<Unresolved Interface>>
Cloneable
GoldRingedStaff
staff
Monkey
- staff : GoldRingedStaff = null + <<Constructor>> Monkey () + clone () : Object + getGoldRingedStaff () : GoldRingedStaff
单例模式(续)
模式使用 在以下情况下可以使用单例模式:
系统只需要一个实例对象。
客户调用类的单个实例只允许使用一个公共访问点。
单例模式(续)
模式应用 ng.Runtime类
java.awt.Toolkit类
数据库主键编号分配 HibernateSessionFactory
单例模式(续)
参与者 Singleton:单例
单例模式(续)
实例分析 实例:打印池的实现
SingletonSpooler
- uniqueInstance : SingletonSpooler - SingletonSpooler () + getInstance () : SingletonSpooler
性质本身的建造涉及到复杂的商业逻辑。这时候,此对象相当于一个有待建造
的产品,而对象的这些性质相当于产品的零件,建造产品的过程就是组合零件 的过程。由于组合零件的过程很复杂,因此,这些“零件”的组合过程往往被 “外部化”到一个称作建造者的对象里,建造者返还给客户端的是一个全部零 件都建造完毕的产品对象。
: void : void : void : void
: void : void : void : void
CarBuilder
+ + + + + <<Constructor>> <<Override>> <<Override>> <<Override>> <<Override>> CarBuilder () buildFrame () buildEngine () buildWheels () buildDoors ()
生成多个笑脸对象,采用的极有可能就是原型模式。
原型模式(续)
模式深入 带原型管理器的原型模式


原型模式中有哪些参与者,简述其职责。 设计一个颜色管理器首先在一个原型管理器(ColorManager)创建了各
种颜色,并将其保存在一个哈希表(Hashtable)中, 当客户需要时,
而Object类提供一个clone()方
法,可以将一个Java对象复制一份。但是,这个Java类必须实现一个标
识接口Cloneable,标识这个Java类支持复制。
原型模式(续)
模式解释 深克隆与浅克隆
在浅克隆中,被复制对象的所有变量都具有与原来的对象相同的值,而
所有的对其它对象的引用仍然指向原来的对象。换言之,浅克隆仅仅复 制所考虑的对象,而不复制它所引用的对象,也就是其中的成员对象并 不复制。在浅克隆中,当对象被复制时它所包含的成员对象却没有被复 制。
原型模式、单例模 式与建造者模式
Sunny Liu weiliu_china@


原型模式 单例模式 建造者模式
原型模式

模式动机 有些对象的创建过程较为复杂,而且有时候需要频繁创建,原型模式通
过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原
型对象的办法创建出更多同类型的对象。这就是原型模式的用意。
有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象
不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地 址、主题、内容、附录等部分,而在最起码的收件人地址未被赋值之前,这个 电子邮件不能发出。有些情况下,一个对象的一些性质必须按照某个顺序赋值 才有意义。在某个性质没有赋值之前,另一个性质则无法赋值。这些情况使得
+ clone () : Prototype
return copy of self;
原型模式(续)
参与者 Prototype:抽象原型类
ConcretePrototype:具体原型类
Client:客户
原型模式(续)
模式解释 所有的Java类都继承自ng.Object,
单例模式(续)
模式定义 单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而
且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供
全局访问的方法。 单例模式的要点有三个: 一是某个类只能有一个实 例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这 个实例。单例模式是一种对象创建型模式。
建造者模式(续)
Vehicle
- type : String - frame : String - engine : String - wheels : String - doors : String + <<Constructor>> + + + + + + + + +
实例分析 实例一:车间造车
单例模式(续)
模式结构
Singleton
- instance : Singleton - Singleton () + getInstance () : Singleton
if(instance==null) instance=new Singleton(); return instance;
原型模式(续)
实例分析 实例一:孙悟空变身(浅克隆)(代码实现)
原型模式(续)
实例分析 实例二:孙悟空变身(深克隆)(代码实现)
原型模式(续)
模式优缺点 原型模式的优点包括:
原型模式允许动态增加或减少产品类。
原型模式提供了简化的创建结构。 原型模式具有给一个应用软件动态加载新功能的能力。 产品类不需要非得有任何事先确定的等级结构 。
就返回一个颜色的克隆。现用原型模式实现该场景并绘制相应的类
图。
单例模式
模式动机 对于系统中的某些类来说,只有一个实例很重要,例如:虽然系统中可
以有许多打印机,但是只能有一个打印机正在工作,一个系统只能有一
个窗口管理器。我们怎样保证一个类只有一个实例并且这个实例易于被 访问呢?一个全局变量使得对象可以被访问,但它不能防止我们实例化 多个对象。一个更好的解决办法是,让类自身负责保存它的唯一实例。 这个类可以保证没有其它实例被创建,并且它可以提供一个访问该实例 的方法。这就是单例模式——Singleton Pattern。
: String : void : String : void : String : void : String : void : void
vehicle
VehicleBuilder
{abstract}
# + + + + +
vehicle : Vehicle getVehicle () : Vehicle buildFrame () : void buildEngine () : void buildWheels () : void buildDoors () : void
SingletonException
+ SingletonException (String s)
单例模式(续)
实例分析 实例:打印池的实现(代码实现)
单例模式(续)
模式优缺点 单例模式的主要优点如下:
提供了对唯一实例的受控访问。
缩小命名空间。 允许对操作和表示的精化。 允许可变数目的实例。
Vehicle (String type) getFrame () setFrame (String frame) getEngine () setEngine (String engine) getWheels () setWheels (String wheels) getDoors () setDoors (String doors) show ()
Shop
+ construct (VehicleBuilder vehicleBuilder) : void
BicycleBuilder
+ + + + + <<Constructor>> <<Override>> <<Override>> <<Override>> <<Override>> BicycleBuilder () buildFrame () buildEngine () buildWheels () buildDoors () + + + + +
相关主题