设计模式
原型模式
用原型实例指定创建对象的各类, 并且通过复制这些原型创建新的对象.
注意事项
- 克隆对象时, 原始对象的构造方法不被执行.
- 浅复制: 浅复制只是复制本对象的原始数据类型, 如int, float, String等, 对于数组和对象引用等是不会复制的. 因此, 浅复制是有风险的.
- 深复制: 不但对原始数据类型做复制, 对于对象中的数组和对象引用也做复制的行为, 从而达到将对象完全复制的效果.
设计原则
- 考虑产生对象的复杂度和类复用;
- 结合系统结构考虑使用浅复制还是深复制.
使用场合
- 产生对象过程比较复杂, 初始化需要许多资源时;
- 希望框架原型和产生对象分开时;
- 同一个对象可能会供其它调用者同时调用访问时.
实现代码
//日常生活类 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; } }