前言
什么是原型模式?
即:①用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新对象。
②允许一个对象在创建另外一个可定制的对象,无需知道创建的细节
原理:
通过将一个原型对象传给要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝他们自己来实施创建,即对象.clone()。
示例:克隆羊问题
有一只羊,名字,年龄,颜色,创建和这只羊属性完全相同的5只羊。
传统方式:
Sheep类
public class Sheep {
private String name;
private int age;
private String color;
public Sheep(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Sheep{" +
"name='" + name + '\'' +
", age=" + age +
", color='" + color + '\'' +
'}';
}
}
Client类
public class Client {
public static void main(String[] args) {
//传统的方法
Sheep sheep = new Sheep("tom", 5, "黑色");
Sheep sheep2 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
Sheep sheep3 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
Sheep sheep4 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
Sheep sheep5 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
System.out.println(sheep);
System.out.println(sheep2);
System.out.println(sheep3);
System.out.println(sheep4);
System.out.println(sheep5);
}
}
优缺点
改进方案:
Object
类提供了一个clone()
方法,该方法可以将一个java
对象复制一份,但是需要实现clone
的java
类必须要实现一个借口Cloneable
,该接口表示该类能够复制并且具有复制的能力=>原型模式
说明:
Sheep类
//需要实现clone的类Sheep(相当于ConcretePrototype,具体的原型类,实现一个克隆自己的操作),需要实现Cloneable接口
public class Sheep implements Cloneable {
private String name;
private int age;
private String color;
public Sheep(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Sheep{" +
"name='" + name + '\'' +
", age=" + age +
", color='" + color + '\'' +
'}';
}
//克隆该实例,使用默认的clone方法来实现
@Override
protected Object clone() {
Sheep sheep=null;
try{
sheep =(Sheep) super.clone();
}catch (Exception e){
System.out.println(e.getMessage());
}
return sheep;
}
}
Client类
public class Client {
public static void main(String[] args) {
System.out.println("原型模式完成对象创建!");
Sheep sheep=new Sheep("tom",5,"黑色");
Sheep sheep2=(Sheep) sheep.clone();//克隆
Sheep sheep3=(Sheep) sheep.clone();
Sheep sheep4=(Sheep) sheep.clone();
Sheep sheep5=(Sheep) sheep.clone();
System.out.println("sheep2="+sheep2);
System.out.println("sheep3="+sheep3);
System.out.println("sheep4="+sheep4);
System.out.println("sheep5="+sheep5);
}
}
如果在Sheep
类中增加一个属性,如“蒙古羊”,只需要在添加完属性之后,重新生成一下toString
方法即可,不需要改动Client
类。