原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,
工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
在java中 体现为 clone() 对象
解决什么问题:
它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,
这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。
public class PrototypeMethodActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prototype_method);
//创建原型
BaseSpoon soup1= new SoupSpoon();
BaseSpoon salad1=new SaladSpoon();
//clone原型 得到新对象
SoupSpoon soup2=null;
SaladSpoon salad2=null;
try {
soup2=(SoupSpoon) soup1.clone();
salad2=(SaladSpoon) salad1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
//输出clone后原型和对应新对象的名字
System.out.print("clone 后:"+soup1.getName()+ "-" + soup2.getName());
System.out.print("clone 后:"+salad1.getName()+ "-" + salad2.getName());
soup1.setName("soup1 spoon");
salad1.setName("salad1 spoon");
soup2.setName("soup2 spoon");
salad2.setName("salad2 spoon");
System.out.print("属性重新赋值后:" + soup1.getName() + "-" + soup2.getName());
System.out.print("属性重新赋值后:" + salad1.getName() + "-" + salad2.getName());
}
}
public class BaseSpoon implements Cloneable {
String name;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
/**
* 浅复制
* @return
* @throws CloneNotSupportedException
*/
@Override
protected BaseSpoon clone() throws CloneNotSupportedException {
BaseSpoon object=null;
try{
object=(BaseSpoon) super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return object;
}
/**
* 深复制
*/
public Object deepClone()throws IOException,ClassNotFoundException{
/**
* 写入当前对象的二进制流
*/
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(this);
/**
* 读出二进制流产生的新对象
*/
ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
return ois.readObject();
}
}
public class SoupSpoon extends BaseSpoon {
public SoupSpoon(){
setName("Soup Spoon");
}
}
public class SaladSpoon extends BaseSpoon {
public SaladSpoon(){
setName("Salad Spoon");
}
}
github地址:https://github.com/zyj18410105150/DesignMode