原型模式-Prototype

原型模式-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");
    }
}

猜你喜欢

转载自www.cnblogs.com/noKing/p/9008082.html