设计模式学习笔记(6)——原型模式

本人做的设计模式学习笔记系列的博文旨在用于个人学习之用,主要记载自己对设计模式的理解及代码的实现

原型模式(Prototype Pattern)

原型模式通过拷贝原型创建新的对象,即使用克隆的方法创建对象,这样创建出来的对象在内存中占据新的地址,并且可以在原型对象的基础上进行扩展。主要角色有抽象原型类、具体原型类和客户类。以下给出代码。

对面向对象语言通用的实现方法

/*
 * 抽象原型类
 * */
interface Prototype{
    public Prototype myclone();
}

/*
 * 具体原型类
 * */
class ConcretePrototype implements Prototype{

    private String attr;

    public String getAttr() {
        return attr;
    }

    public void setAttr(String attr) {
        this.attr = attr;
    }

    @Override
    public Prototype myclone() {
        Prototype prototype=new ConcretePrototype();
        ((ConcretePrototype) prototype).setAttr(this.attr);
        return prototype;
    }

}

public class PrototypePattern {
    public static void main(String[] args) {
        Prototype prototype1=new ConcretePrototype();
        ((ConcretePrototype)prototype1).setAttr("Seq11223123341");
        Prototype prototype2=prototype1.myclone();
    }
}

  对于java,需要实现Cloneable接口,并且,当原型对象较多时,可以将多个原型对象放在一个集合中供客户使用,这就引入了原型管理器的概念。实现如下:

import java.util.Hashtable;

/*
 * 抽象原型类
 * */
interface Prototype extends Cloneable {
    public Prototype clone();
    public void display();
}

/*
 * 具体原型类1
 * */
class ConcretePrototype1 implements Prototype{

    @Override
    public Prototype clone() {
        ConcretePrototype1 cp1=null;
        try {
            cp1=(ConcretePrototype1)super.clone();
        } catch (Exception e) {
            System.out.println("具体原型类1不支持复制!");
        }
        return cp1;
    }

    @Override
    public void display() {
        System.out.println("这是具体原型类1"); 
    }

}


/*
 * 具体原型类2
 * */
class ConcretePrototype2 implements Prototype{

    @Override
    public Prototype clone() {
        ConcretePrototype2 cp2=null;
        try {
            cp2=(ConcretePrototype2)super.clone();
        } catch (Exception e) {
            System.out.println("具体原型类2不支持复制!");
        }
        return cp2;
    }

    @Override
    public void display() {
        System.out.println("这是具体原型类2"); 
    }

}


/*
 * 给予饿汉单例模式实现的原型管理器
 * */
class PrototypeManager{
    private Hashtable hashtable=new Hashtable();
    private static PrototypeManager pManager=new PrototypeManager();

    //私有构造函数
    private  PrototypeManager() {
        hashtable.put("cp1", new ConcretePrototype1());
        hashtable.put("cp2", new ConcretePrototype2());
    }

    //新增具体原型类方法
    public void addNewConcretePrototype(String key, Prototype prototype) {
        hashtable.put(key, prototype);
    }

    //浅克隆复制方法
    public Prototype getPrototype(String key) {
        return hashtable.get(key).clone();
    }

    public static PrototypeManager getInstance() {
        return pManager;
    }
}

public class PrototypePattern {
    public static void main(String[] args) {
        PrototypeManager prototypeManager=PrototypeManager.getInstance();
        Prototype p1,p2;
        p1=prototypeManager.getPrototype("cp1");
        p1.display();
        p2=prototypeManager.getPrototype("cp2");
        p2.display();
        System.out.println(p1==p2);

        Prototype p3,p4;
        p3=prototypeManager.getPrototype("cp1");
        p3.display();
        System.out.println(p3==p1);
    }
}

运行结果:

这是具体原型类1
这是具体原型类2
false
这是具体原型类1
false


关于原型模式的深入内容可以参考链接:
http://blog.csdn.net/lovelion/article/details/17517213

你可能感兴趣的:(设计模式)