一、模式说明 看了比较多的资料,对原型模式写的比较复杂,个人的理解就是模型复制,根据现有的类来直接创建新的类,而不是调用类的构造函数。 二、原型模式的类图 三、原型模
一、模式说明
看了比较多的资料,对原型模式写的比较复杂,个人的理解就是模型复制,根据现有的类来直接创建新的类,而不是调用类的构造函数。
二、原型模式的类图
三、原型模式中的角色
- 原型(Protype)角色:负责定义复制现有实例生成新实例的方法
- 具体原型(ConcretePrototype)角色:负责实现复制现有实例生成新实例的方法
- 使用者(Client)角色:负责使用复制实例的方法生成新实例
四、代码示例
1.Product类:
package com.designpattern.cn.protptypepattern.patternframework; public interface Product extends Cloneable { public abstract void use(String s); public abstract Product createClone(); }View Code
上面的Product类很简单,只是继承了java.lang.Clonable接口,该接口中并没有要求实现任何方法,这是一个标记接口,被该接口标记的类可以调用Clone方法来克隆类实例。需要注意的是,Clone方法并不是定义在Clonable接口中,而是定义在java.lang.Object中,另外需要提一点,Clone方法实现的是浅复制。
2.Manager类:
package com.designpattern.cn.protptypepattern.patternframework; import java.util.HashMap; public class Manager { private HashMap showcase = new HashMap(); public void register(String name, Product product){ showcase.put(name, product); } public Product create(String protoname){ Product p = (Product) showcase.get(protoname); return p.createClone(); } }View Code
上面的Manager类提供了register方法,将字符串和Product接口注册保存到showcase中,现在还无法知道Product具体类是什么,但是可以确定这个具体类是实现了Product接口的,因此这个类可以调用use方法和createClone方法创建实例的克隆。
接下来创建几种不同的Product具体的子类,每个子类都实现了Product接口:
3-1.MessageBox消息盒子类:
package com.designpattern.cn.protptypepattern.patterndemostrate; import com.designpattern.cn.protptypepattern.patternframework.Product; public class MessageBox implements Product { private char decochar; public MessageBox(char decochar){ this.decochar = decochar; } public void use(String s){ int length = s.getBytes().length; for(int i = 0; i < length + 4; i++){ System.out.print(decochar); } System.out.println(""); System.out.println(decochar+" "+s+" "+decochar); for(int i = 0; i < length + 4; i++){ System.out.print(decochar); } System.out.println(""); } public Product createClone(){ Product p = null; try { p = (Product) clone(); }catch (CloneNotSupportedException e){ e.printStackTrace(); } return p; } }View Code
3-2UnderlinePen类:
package com.designpattern.cn.protptypepattern.patterndemostrate; import com.designpattern.cn.protptypepattern.patternframework.Product; public class UnderlinePen implements Product { private char ulchar; public UnderlinePen(char ulchar){ this.ulchar = ulchar; } public void use(String s){ int length = s.getBytes().length; System.out.println("\"" + s + "\""); System.out.println(" "); for(int i = 0; i < length + 4; i++){ System.out.print(ulchar); } System.out.println(""); } public Product createClone(){ Product p = null; try { p = (Product) clone(); }catch (CloneNotSupportedException e){ e.printStackTrace(); } return p; } }View Code
4.测试类和运行结果:
原型模式在JavaScript中也有应用,后续再补充这方面的内容,可以对比看下Java和Javascript中实现原型模式的不同。
---------------------2019-06-27 00:13 比较晚了,今天加班到10点回家,原型模式还是比较重要的,这篇随笔后续继续补充-----------------------------