zoukankan      html  css  js  c++  java
  • 原型模式登记形式

    (参考: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();
            }
            
            
        }
    }

  • 相关阅读:
    CentOS LiveCD、LiveDVD、BinDVD、netinstall、minimal版区别在哪里
    安装oracle执行runInstaller文件时报错:“……/install/.oui:Permission denied”
    centos7修改系统语言为简体中文
    Centos 7 安装图形化界面
    Centos7中一次性安装开发者工具
    IE 11 浏览器兼容性视图设置
    [bzoj1775][Usaco2009 Dec]Vidgame 电视游戏问题_背包dp
    Codeforces Round #581(Div. 2)

    [Nowcoder113E]弹球弹弹弹_线段树
  • 原文地址:https://www.cnblogs.com/Michael2397/p/7604821.html
Copyright © 2011-2022 走看看