原型模式-Prototype
通过复制(克隆、拷贝)一个指定类型的对象来创建更多同类型的对象.
Product接口
我们将使用原型模式来创建对象, 而这些对象, 就被抽象为Product
Product还提供了复制方法createClone(). 继承了Cloneable接口.
注意: 这里的createClone()方法并不是继承于Cloneable, Cloneable里面并没有声明任何方法, Cloneable只是起标记作用的一个接口.
public interface Product extends Cloneable { void use(String str); Product createClone(); }
UnderlinePen类
这是Product接口的实现类, 下划线类.
向特定的下划线类传入一个字符串后, 他会打印出该字符串和下划线
public class UnderLinePen implements Product { /** * 下划线字符 */ private char underLineChar; public UnderLinePen(char ch) { this.underLineChar = ch; } /** * 传入str后, 会打印str和下划线 */ @Override public void use(String str) { System.out.println("\"" + str + "\""); System.out.print(" "); for (int i = 0; i < str.getBytes().length; i++) { System.out.print(underLineChar); } System.out.println(""); } /** * 返回一个克隆 */ @Override public Product createClone() { try { return (Product) this.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } }
UnderLinePenManager类
用于统一管理产品, 他来负责注册和克隆
public class UnderLinePenManager { /** * 各种笔注册到这里, 统一管理 */ private static final HashMap<String, Product> PENS = new HashMap<>(); /** * 注册笔 */ public static void register(String name, Product pen) { PENS.put(name, pen); } /** * 从注册中心HashMap以name为key取出来一只笔, 然后克隆一个新的来返回 */ public static Product createPen(String name) { return PENS.get(name).createClone(); } }
Main
该类用于运行测试
public class Main { static { /** * 将各种笔注册到Manager来统一管理 */ UnderLinePenManager.register("wave-line" , new UnderLinePen('~')); UnderLinePenManager.register("bee-line" , new UnderLinePen('_')); UnderLinePenManager.register("dotted-line", new UnderLinePen('.')); } public static void main(String[] args) { // 每次需要某种笔的时候, 根据现有的笔来进行克隆一份就好了 // 取出一只波浪线的笔 Product anotherPen1 = UnderLinePenManager.createPen("wave-line"); // 用波浪线的笔来打印 anotherPen1.use("hello world"); } }