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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SingletonException
+ SingletonException (String s)
单例模式(续)
实例分析 实例:打印池的实现(代码实现)
单例模式(续)
模式优缺点 单例模式的主要优点如下:
提供了对唯一实例的受控访问。
缩小命名空间。 允许对操作和表示的精化。 允许可变数目的实例。
: void : void : void : void
: void : void : void : void
CarBuilder
+ + + + + <<Constructor>> <<Override>> <<Override>> <<Override>> <<Override>> CarBuilder () buildFrame () buildEngine () buildWheels () buildDoors ()
原型模式(续)
模式解释 深克隆与浅克隆
原型模式(续)
实例分析 实例一:孙悟空变身(浅克隆)
<<Unresolved Interface>>
Cloneable
GoldRingedStaff
staff
Monkey
- staff : GoldRingedStaff = null + <<Constructor>> Monkey () + clone () : Object + getGoldRingedStaff () : GoldRingedStaff
而Object类提供一个clone()方
法,可以将一个Java对象复制一份。但是,这个Java类必须实现一个标
识接口Cloneable,标识这个Java类支持复制。
原型模式(续)
模式解释 深克隆与浅克隆
在浅克隆中,被复制对象的所有变量都具有与原来的对象相同的值,而
所有的对其它对象的引用仍然指向原来的对象。换言之,浅克隆仅仅复 制所考虑的对象,而不复制它所引用的对象,也就是其中的成员对象并 不复制。在浅克隆中,当对象被复制时它所包含的成员对象却没有被复 制。
单例模式(续)
模式结构
Singleton
- instance : Singleton - Singleton () + getInstance () : Singleton
if(instance==null) instance=new Singleton(); return instance;
原型模式、单例模 式与建造者模式
Sunny Liu weiliu_china@126.com


原型模式 单例模式 建造者模式
原型模式
模式动机 有些对象的创建过程较为复杂,而且有时候需要频繁创建,原型模式通
过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原
型对象的办法创建出更多同类型的对象。这就是原型模式的用意。
: String : void : String : void : String : void : String : void : void
vehicle
VehicleBuilder
{abstract}
# + + + + +
vehicle : Vehicle getVehicle () : Vehicle buildFrame () : void buildEngine () : void buildWheels () : void buildDoors () : void
Vehicle (String type) getFrame () setFrame (String frame) getEngine () setEngine (String engine) getWheels () setWheels (String wheels) getDoors () setDoors (String doors) show ()
原型模式(续)
实例分析 实例一:孙悟空变身(浅克隆)(代码实现)
原型模式(续)
实例分析 实例二:孙悟空变身(深克隆)(代码实现)
原型模式(续)
模式优缺点 原型模式的优点包括:
原型模式允许动态增加或减少产品类。
原型模式提供了简化的创建结构。 原型模式具有给一个应用软件动态加载新功能的能力。 产品类不需要非得有任何事先确定的等级结构 。
单例模式(续)
模式深入 饿汉式单例类
单例模式(续)
模式深入 懒汉式单例类


分析并理解EagerSingleton和LazySingleton的异同。 某公司只购买一个JDBC驱动软件的使用许可,能否使用单例模式管
理通过JDBC驱动软件连接的数据库?
建造者模式
模式动机
模式使用 在下面的情况下可以使用原型模式:
类的实例化是动态的。
需要避免使用分层次的工厂类来创建分层次的对象。 类的实例对象只有一个或很少的几个组合状态。
原型模式(续)
模式应用 原型模式在很多软件都可以找到它的应用,如果实例化一个类要花
大量时间,原型模式是最好的解决方案。Word可以采用Copy-Paste
Product
建造者模式(续)
参与者 Builder:抽象建造者
ConcreteBuilder:具体建造者
Director:指挥者 Product:产品角色
建造者模式(续)
代码分析 实例:汽车组装车间、组装电脑(05-06Builder-AbstractFactory.java)
建造者模式(续)
模式定义 建造者模式( Builder Pattern):将一个复杂对象的构建与它的表示分离,
使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建
一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以 构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象 创建型模式。
原型模式(续)
模式结构
Client
+ operation () prototype
Prototype
+ clone () : Prototype
Biblioteka Baidu
p=prototype.clone();
ConcretePrototypeA
+ clone () : Prototype
ConcretePrototypeB
单例模式(续)
模式使用 在以下情况下可以使用单例模式:
系统只需要一个实例对象。
客户调用类的单个实例只允许使用一个公共访问点。
单例模式(续)
模式应用 java.lang.Runtime类
java.awt.Toolkit类
数据库主键编号分配 HibernateSessionFactory
+ clone () : Prototype
return copy of self;
原型模式(续)
参与者 Prototype:抽象原型类
ConcretePrototype:具体原型类
Client:客户
原型模式(续)
模式解释 所有的Java类都继承自java.lang.Object,
MotorBuilder
<<Constructor>> <<Override>> <<Override>> <<Override>> <<Override>> MotorBuilder () buildFrame () buildEngine () buildWheels () buildDoors ()
生成多个笑脸对象,采用的极有可能就是原型模式。
原型模式(续)
模式深入 带原型管理器的原型模式


原型模式中有哪些参与者,简述其职责。 设计一个颜色管理器首先在一个原型管理器(ColorManager)创建了各
种颜色,并将其保存在一个哈希表(Hashtable)中, 当客户需要时,
原型模式(续)
模式定义 原型模式(Prototype Pattern):它是一种对象创建型模式,用原型实例指
定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式允
许一个对象再创建另外一个可定制的对象,无需知道任何创建的细节。 工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要 发动创建的对象通过请求原型对象拷贝原型自己来实现创建过程。
单例模式(续)
模式定义 单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而
且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供
全局访问的方法。 单例模式的要点有三个: 一是某个类只能有一个实 例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这 个实例。单例模式是一种对象创建型模式。
建造者模式(续)
模式结构
Director
+ construct () builder
Builder
+ buildPart ()
for all objects in structure { builder.buildPart(); }
ConcreteBuilder
+ buildPart () + getResult ()
Shop
+ construct (VehicleBuilder vehicleBuilder) : void
BicycleBuilder
+ + + + + <<Constructor>> <<Override>> <<Override>> <<Override>> <<Override>> BicycleBuilder () buildFrame () buildEngine () buildWheels () buildDoors () + + + + +
建造者模式(续)
Vehicle
- type : String - frame : String - engine : String - wheels : String - doors : String + <<Constructor>> + + + + + + + + +
实例分析 实例一:车间造车
有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象
不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地 址、主题、内容、附录等部分,而在最起码的收件人地址未被赋值之前,这个 电子邮件不能发出。有些情况下,一个对象的一些性质必须按照某个顺序赋值 才有意义。在某个性质没有赋值之前,另一个性质则无法赋值。这些情况使得
单例模式(续)
参与者 Singleton:单例
单例模式(续)
实例分析 实例:打印池的实现
SingletonSpooler
- uniqueInstance : SingletonSpooler - SingletonSpooler () + getInstance () : SingletonSpooler
就返回一个颜色的克隆。现用原型模式实现该场景并绘制相应的类
图。
单例模式
模式动机 对于系统中的某些类来说,只有一个实例很重要,例如:虽然系统中可
以有许多打印机,但是只能有一个打印机正在工作,一个系统只能有一
个窗口管理器。我们怎样保证一个类只有一个实例并且这个实例易于被 访问呢?一个全局变量使得对象可以被访问,但它不能防止我们实例化 多个对象。一个更好的解决办法是,让类自身负责保存它的唯一实例。 这个类可以保证没有其它实例被创建,并且它可以提供一个访问该实例 的方法。这就是单例模式——Singleton Pattern。
原型模式(续)
模式优缺点 原型模式的缺点有:
原型模式的最主要缺点就是每一个类必须配备一个克隆方法。而且这个
克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难, 但对已有的类进行改造时,不一定是件容易的事。
原型模式的另一个缺点是在实现深克隆时需要编写较为复杂的代码。
原型模式(续)
性质本身的建造涉及到复杂的商业逻辑。这时候,此对象相当于一个有待建造
的产品,而对象的这些性质相当于产品的零件,建造产品的过程就是组合零件 的过程。由于组合零件的过程很复杂,因此,这些“零件”的组合过程往往被 “外部化”到一个称作建造者的对象里,建造者返还给客户端的是一个全部零 件都建造完毕的产品对象。
相关文档
最新文档