复习:GoF的23种设计模式之Prototype模式(创建型)

2019-12-25 16:08:10 浏览数 (1)

闲扯一下,我们都吃过月饼吧,那大家知道月饼是怎么制作出来的吗?(以前的工艺)

我小时候有经历过月饼的制作,提前买好面粉、糖、摸具、鸭蛋黄等,将面粉揉成团然后再用杆搓成面皮,将鸭蛋黄、糖配料什么的一股脑的卷成一团,用面皮包裹好,再使用模具整好形状,烤至金黄,出锅开吃。

Prototype模式(原型)

上面讲的使用模具整理好月饼,也可以看做一个原型模式,我们制作模具的过程,就已经完成了一个形状满意的月饼,后面制作月饼都和前一个类似。

原型模式定义:通过“复制”一个已经存在的实例来返回新的实例,而不是新键实例。被复制的实例就是我们称的“原型”。

  1. 复制一个实例相比new一个实例更加高效;
  2. 对于创建复制的对象或者说是几个类整合到一起的对象,更加方便;

示例代码

代码语言:javascript复制
public class PrototypeTest {
    public static void main(String[] args) {
        PrototypeManage manage = new PrototypeManage();
        Prototype prototype1 = new Mooncake("月饼");
        manage.register("月饼",prototype1);
        //通过原型创建新对象。
        Prototype prototype2 = manage.create("月饼");
        prototype2.user();
        System.out.println(prototype1 == prototype2);//false
    }
}

interface Prototype extends Cloneable {
    public abstract void user();
    public abstract Prototype createClone();
}
class Mooncake implements Prototype{
    String str = null;
    public Mooncake(String s) {
        this.str = s;
    }
    public void user() {
        System.out.println("这是一个复杂的" str);
    }
    public Prototype createClone() {
        Prototype prototy = null;
        try {
            prototy = (Prototype) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return prototy;
    }
}

class PrototypeManage {
    Map<String, Prototype> map = new HashMap<String, Prototype>();
    public void register(String name, Prototype prototype) {
        map.put(name, prototype);
    }
    public Prototype create(String prototypeName) {
        Prototype clone = map.get(prototypeName).createClone();
        return clone;
    }
}

UML类图

0 人点赞