场景模式
在现在的工厂生产中,我们生产的产品都是大同小异的。即基本上都是相同的。在这种情况下,如果每次生产一个产品都要我们自己手动的去输入参数,相当于自己去new一个,那么就会显得很麻烦。那么我们想到的最好的办法就是用克隆的办法去从一个对象生成另一个和此对象相同的对象。原型模式就是我们说到的克隆。即根据一个对象生成一个与此对象一摸一样的对象。
注:因为java中是存在实现原型模式的接口的,即Cloneable。如果有些语言没有,就是一个接口,里面有一个抽象的clone方法。但是在java中cloneable是标记接口,因为里面其实是没有抽象方法
代码实现
Configuration class
public class Configuration {
int memory;
String CPU;
public Configuration(int memory, String CPU) {
this.memory = memory;
this.CPU = CPU;
}
public int getMemory() {
return memory;
}
public String getCPU() {
return CPU;
}
public void setMemory(int memory) {
this.memory = memory;
}
public void setCPU(String CPU) {
this.CPU = CPU;
}
@Override
public String toString() {
return "Configuration{" +
"memory=" + memory +
", CPU='" + CPU + '\'' +
'}';
}
}
MacPro
public class MacPro implements Cloneable{
int size;
String model;
Configuration configuration;
public MacPro(int size, String model, Configuration configuration) {
this.size = size;
this.model = model;
this.configuration = configuration;
}
public int getSize() {
return size;
}
public String getModel() {
return model;
}
public Configuration getConfiguration() {
return configuration;
}
public void setSize(int size) {
this.size = size;
}
public void setModel(String model) {
this.model = model;
}
public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Test
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Configuration configuration = new Configuration(1024,"i9");
MacPro macPro = new MacPro(16,"macBook Pro",configuration);
MacPro clonemacPro = (MacPro)macPro.clone();
System.out.println(clonemacPro == clonemacPro);
System.out.println(clonemacPro.getModel()+" "+clonemacPro.getSize()+" "+clonemacPro.getConfiguration());
System.out.println("以下是测试浅拷贝和深拷贝,和原型模式已经没啥关系了");
clonemacPro.setModel("mac Air");
clonemacPro.setSize(13);
configuration.setCPU("i7");
clonemacPro.setConfiguration(configuration);
System.out.println(macPro.getModel()+" "+macPro.getSize()+" "+macPro.getConfiguration());
}
}
写在最后
注意深克隆和浅克隆问题。这个问题的但是其实是因为数据是基本类型还是引用类型类型造成的。引用类型复制的是引用值。但是在JAVA中又要主要String类型。虽然其是引用类型,但是却存在常量池中。这里就是提一下。