原型模式登记形式

原型模式登记形式

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

 

posted on 2017-09-28 08:13 Michael2397 阅读(...) 评论(...) 编辑 收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需通过显式的实例化过程。原型模式通过克隆(clone)已有对象来创建新对象,从而避免了使用传统的构造函数创建对象的开销。 在C++中,原型模式可以通过实现一个可克隆接口(通常称为原型接口)来实现。这个接口通常包含一个克隆方法,用于复制当前对象并返回一个新的副本。派生类可以实现这个接口来定义自己的克隆逻辑。 以下是原型模式的一般实现步骤: 1. 创建一个原型接口(或基类): ``` class Prototype { public: virtual Prototype* clone() const = 0; virtual void setAttributes(...) = 0; virtual void print() const = 0; }; ``` 2. 实现原型接口的具体类(或派生类): ``` class ConcretePrototype : public Prototype { private: // 在派生类中定义特定的属性 // ... public: Prototype* clone() const override { return new ConcretePrototype(*this); } void setAttributes(...) override { // 设置属性值 } void print() const override { // 打印属性值 } }; ``` 3. 在客户端代码中使用原型模式: ``` Prototype* original = new ConcretePrototype(); original->setAttributes(...); Prototype* clone = original->clone(); clone->print(); delete original; delete clone; ``` 通过使用原型模式,我们可以避免在每次创建对象时重复执行初始化的过程,提高了对象的创建效率。此外,原型模式还允许我们在运行时动态地添加或删除对象的属性,并通过克隆来创建新对象。 需要注意的是,在实现原型类时,需要确保所有成员变量都能正确地被拷贝(或克隆)。有时候可能需要自定义拷贝构造函数和赋值运算符来实现深拷贝,以避免浅拷贝带来的问题。 总结起来,原型模式通过克隆已有对象来创建新对象,提供了一种简单且灵活的对象创建方式。它适用于那些对象的创建过程比较复杂或开销较大的情况下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值