原型模式登记形式

(参考:http://www.cnblogs.com/java-my-life/archive/2012/04/11/2439387.html

在这种情况下,客户端不保存对原型对象的引用,这个任务被交给管理员对象。在复制一个原型对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象。如果有,可以直接从管理员类取得这个对象引用;如果没有,客户端就需要自行复制此原型对象。

/**
 * Project Name:DesignPatterns
 * File Name:Prototype.java
 * Package Name:com.louis.clone.Manager
 * Date:2017年9月27日上午9:08:05
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.clone.Manager;
/**
 * ClassName:Prototype 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年9月27日 上午9:08:05 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public interface Prototype {
    public Prototype clone();
    public String getName();
    public void setName(String name);
}
/**
 * Project Name:DesignPatterns
 * File Name:ConcretePrototype1.java
 * Package Name:com.louis.clone.Manager
 * Date:2017年9月27日上午9:09:49
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.clone.Manager;
/**
 * ClassName:ConcretePrototype1 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年9月27日 上午9:09:49 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class ConcretePrototype1 implements Prototype {
    String name;
    public Prototype clone(){
        ConcretePrototype1 concretePrototype1 = new ConcretePrototype1();
        concretePrototype1.setName(this.name);
        return concretePrototype1;
        
    }
    /**
     * TODO 简单描述该方法的实现功能(可选).
     * @see com.louis.clone.Manager.Prototype#getName()
     */
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return name;
    }

    /**
     * TODO 简单描述该方法的实现功能(可选).
     * @see com.louis.clone.Manager.Prototype#setName(java.lang.String)
     */
    @Override
    public void setName(String name) {
        // TODO Auto-generated method stub
        this.name = name;
    }

    public String toString() {
        return "Now in Prototype1 , name = " + this.name;
    }
}
/**
 * Project Name:DesignPatterns
 * File Name:ConcretePrototype1.java
 * Package Name:com.louis.clone.Manager
 * Date:2017年9月27日上午9:09:49
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.clone.Manager;
/**
 * ClassName:ConcretePrototype1 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年9月27日 上午9:09:49 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class ConcretePrototype2 implements Prototype {
    String name;
    public Prototype clone(){
        ConcretePrototype2 concretePrototype2 = new ConcretePrototype2();
        concretePrototype2.setName(this.name);
        return concretePrototype2;
        
    }
    /**
     * TODO 简单描述该方法的实现功能(可选).
     * @see com.louis.clone.Manager.Prototype#getName()
     */
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return name;
    }

    /**
     * TODO 简单描述该方法的实现功能(可选).
     * @see com.louis.clone.Manager.Prototype#setName(java.lang.String)
     */
    @Override
    public void setName(String name) {
        // TODO Auto-generated method stub
        this.name = name;
    }

    public String toString() {
        return "Now in Prototype2 , name = " + this.name;
    }
}
/**
 * Project Name:DesignPatterns
 * File Name:PrototypeManager.java
 * Package Name:com.louis.clone.Manager
 * Date:2017年9月27日上午9:13:39
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.clone.Manager;

import java.util.HashMap;
import java.util.Map;

import org.omg.PortableServer.POA;

/**
 * ClassName:PrototypeManager 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年9月27日 上午9:13:39 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class PrototypeManager {
    /*
     * 用来记录原型的编号和原型实例的对应关系
     * */
    private static Map<String, Prototype> map = new HashMap<String,Prototype>();
    /*
     * 私有构造方法,防止外部创建实例
     * */
    private PrototypeManager(){}
    /*
     * 向原型管理器里面添加或修改某个原型的注册
     * */
    public synchronized static void setPrototype(String prototypeId,Prototype prototype){
        map.put(prototypeId, prototype);
    }
    /*
     * 从原型管理器里面删除某个原型注册
     * */
    public synchronized static void removePrototype(String prototypeId){
        map.remove(prototypeId);
    }
    /*
     * 获取某个原型编号对应的原型实例
     * */
    public synchronized static Prototype getPrototype(String prototypeId) throws Exception{
        Prototype prototype = map.get(prototypeId);
        if(prototype == null){
            throw new Exception("您希望获取的原型还没有注册或已被销毁");
        }
        return prototype;
    }

}
/**
 * Project Name:DesignPatterns
 * File Name:Client.java
 * Package Name:com.louis.clone.Manager
 * Date:2017年9月27日上午9:23:05
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.clone.Manager;
/**
 * ClassName:Client 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年9月27日 上午9:23:05 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class Client {
    public static void main(String[] args) {
        Prototype p1 = new ConcretePrototype1();
        PrototypeManager.setPrototype("p1", p1);
        
        //获取原型来创建
        Prototype p3;
        try {
            p3 = PrototypeManager.getPrototype("p1").clone();
            p3.setName("张三");
            System.out.println("第一个实例"+p3);
            //有人动态的切换了实现
            Prototype p2 = new ConcretePrototype2();
            PrototypeManager.setPrototype("p1", p2);
            //重新获取原型来创建对象
            Prototype p4 = PrototypeManager.getPrototype("p1").clone();
            p4.setName("李四");
            System.out.println("第二个实例"+p4);
            //有人注销了这个原型
            PrototypeManager.removePrototype("p1");
            //再次获取原型来创建对象
            Prototype p5 = PrototypeManager.getPrototype("p1").clone();
            p5.setName("王五");
            System.out.println("第三个实例:" + p5);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }
}

原文地址:https://www.cnblogs.com/Michael2397/p/7604821.html