前言
Android的设计模式系列文章介绍,欢迎关注,持续更新中:
Android的设计模式-设计模式的六大原则
创建型模式:
Android的设计模式-单例模式
Android的设计模式-建造者模式
Android的设计模式-工厂方法模式
Android的设计模式-简单工厂模式
Android的设计模式-抽象工厂模式
Android的设计模式-原型模式
行为型模式:
Android的设计模式-策略模式
Android的设计模式-状态模式
Android的设计模式-责任链模式
Android的设计模式-观察者模式
1.定义
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
2.介绍
- 原型模式属于创建型模式。
- 一个已存在的对象(即原型),通过复制原型的方式来创建一个内部属性跟原型都一样的新的对象,这就是原型模式。
- 原型模式的核心是clone方法,通过clone方法来实现对象的拷贝。
3.UML类图
3.1 角色说明:
- Prototype(抽象原型类):抽象类或者接口,用来声明clone方法。
- ConcretePrototype(具体原型类):即要被复制的对象。
- Client(客户端类):即要使用原型模式的地方。
4.实现
4.1 Prototype(抽象原型类):
- 通常情况下,Prototype是不需要我们去定义的。因为拷贝这个操作十分常用,Java中提供了Cloneable接口来支持拷贝操作,它就是原型模式中的Prototype。
- 当然,原型模式也未必非得去实现Cloneable接口,也有其他的实现方式。
4.2 创建具体原型类,实现Cloneable接口:
//具体原型类,卡片类
public class Card implements Cloneable {
//实现Cloneable接口,Cloneable只是标识接口
private int num;//卡号
private Spec spec = new Spec();//卡规格
public Card() {
System.out.println("Card 执行构造函数");
}
public void setNum(int num) {
this.num = num;
}
public void setSpec(int length, int width) {
spec.setLength(length);
spec.setWidth(width);
}
@Override
public String toString() {
return "Card{" +
"num=" + num +
", spec=" + spec +
'}';
}
@Override
protected Card clone() throws CloneNotSupportedException {
//重写clone()方法,clone()方法不是Cloneable接口里面的,而是Object里面的
System.out.println("clone时不执行构造函数");
return (Card) super.clone();
}
}
//规格类,有长和宽这两个属性
public class Spec {
private int width;
private int length;
public void setLength(int length) {
this.length = length;
}
public void setWidth(int width) {
this.width = width;
}
@Override
public String toString() {
return "Spec{" +
"width=" + width +
", length=" + length +
'}';
}
}
4.3 创建客户端类,即要使用原型模式的地方:
public class Client {
public void test() throws CloneNotSupportedException {
Card card1 = new Card();
card1.setNum(9527);
card1.setSpec(10