原型模式

设计模式

原型模式

  用原型实例指定创建对象的各类, 并且通过复制这些原型创建新的对象.

注意事项

  1. 克隆对象时, 原始对象的构造方法不被执行.
  2. 浅复制: 浅复制只是复制本对象的原始数据类型, 如int, float, String等, 对于数组和对象引用等是不会复制的. 因此, 浅复制是有风险的.
  3. 深复制: 不但对原始数据类型做复制, 对于对象中的数组和对象引用也做复制的行为, 从而达到将对象完全复制的效果.

设计原则

  1. 考虑产生对象的复杂度和类复用;
  2. 结合系统结构考虑使用浅复制还是深复制.

使用场合

  1. 产生对象过程比较复杂, 初始化需要许多资源时;
  2. 希望框架原型和产生对象分开时;
  3. 同一个对象可能会供其它调用者同时调用访问时.

实现代码

//日常生活类
public class DayLife02 implements Cloneable
{
    private String getUp;
    private String byBus;
    private String getFood;
    private List<String> list;
    
    public List<String> getList()
    {
        return list;
    }
    public void setList(List<String> list)
    {
        this.list = list;
    }
    public String getGetUp()
    {
        return getUp;
    }
    public void setGetUp(String getUp)
    {
        this.getUp = getUp;
    }
    public String getByBus()
    {
        return byBus;
    }
    public void setByBus(String byBus)
    {
        this.byBus = byBus;
    }
    public String getGetFood()
    {
        return getFood;
    }
    public void setGetFood(String getFood)
    {
        this.getFood = getFood;
    }
    
    @Override
    protected DayLife02 clone()
    {
        try
        {
                DayLife02 dayLife02 = (DayLife02) super.clone();
                List<String> new_list = new ArrayList<String>();
                
                new_list.addAll(dayLife02.getList());
                dayLife02.setList(new_list);
                
            return dayLife02;
        }
        catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return null;
    }
    
}
//工厂类
public interface ILifeFactory02
{
    public DayLife02 getNewInstance();
}
//工厂实现类
public class LifeFactoryImp02 implements ILifeFactory02
{
    private static DayLife02 dayLife02 = null;
    
    public DayLife02 getNewInstance()
    {
        if(null == dayLife02)
        {
            System.out.println("It is new DayLife");
            
            ArrayList<String> list = new ArrayList<String>();
            list.add("aa");
            list.add("bb");
            
            dayLife02 = new DayLife02();
            
            dayLife02.setGetUp("07:00");
            dayLife02.setByBus("08:00");
            dayLife02.setGetFood("09:00");
            dayLife02.setList(list);
        }
        else
        {
            System.out.println("clone DayLife");
            
            dayLife02 = dayLife02.clone();
        }
        
        return dayLife02;
    }

}

 

posted @ 2016-06-08 15:11  我也姓程  阅读(152)  评论(0编辑  收藏  举报