java设计模式-原型模式


原型模式定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:
通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。


原型模式有两种实现方法:

一种是简单的创建模式。一种是登记式的。

同时Java中的提供clone()方法来实现对象的克隆,

第一种:这里截取一张图

这里截取一张图

public abstract class AbstractSpoon implements Cloneable
{ 
  String spoonName; 

  public void setSpoonName(String spoonName) {this.spoonName = spoonName;}
  public String getSpoonName() {return this.spoonName;}

  public Object clone() 
  {
    Object object = null;
    try {
      object = super.clone();
    } catch (CloneNotSupportedException exception) {
      System.err.println("AbstractSpoon is not Cloneable");
    }
    return object;
  }
}
下面定义一个具体的实现

public class SoupSpoon extends AbstractSpoon
{ 
  public SoupSpoon()
  {
    setSpoonName("Soup Spoon"); 
  }
}
 

这里的调用方法是


AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon2 = spoon.clone();


第二中:登记式的,这里截取一张图

这里截取一张图


这里比上面就多了一个PrototypeManager,这里没有写里面的实例变量

public class SpoonManager {
    /**
     * 用来记录原型的编号和原型实例的对应关系
     */
    private static Map<String,Prototype> map = new HashMap<String,Prototype>();
    
    private SpoonManager(){}
    
    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;
    }
}

这里的调用方法就是

AbstractSpoon spoon1 = new SoupSpoon();
 SpoonManager.setPrototype("1", spoon1);
            //获取原型来创建对象
 AbstractSpoon spoon2 = SpoonManager.getPrototype("1").clone();

这样就有了spoon2是由spoon1 克隆而来,同时这样的方法的一个好处是

你将创建过的对象都保存在一个map中,所以不需要你自己去记住有哪些引用,这样的话之后你每一个想得到一个对象,你可以先去map中找有没有已经登记在map中的,有的话直接使用,没有的情况再去创建。这样当想创建的对象很多的时候会很有用。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值