原型模式使之 “用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。”
“用原型实例指定创建对象的种类” 可理解为 “新建一个对象”,运用一个原型指定对象种类
“通过拷贝这些原型创建新的对象” 可理解为 “通过现有对象的复制实现新对象的创建”
举一个很简单的例子.
我有一次在学校,舍友告诉我宿舍的钥匙丢了,于是我马上去小卖部找师傅配钥匙,只见师傅把我的钥匙放在机器上,一按按钮一下子就出来两个一模一样的钥匙了.
原型模式结构:由 “客户角色”、”抽象原型角色“、具体原型角色 组成
客户角色:客户类提出创建对象的请求
抽象原型角色:这是一个抽象角色,通常由一个Java接口或Java抽象类实现。此角色给出所有的具体原型类所需的接口
具体原型角色:被复制的对象.此角色需要实现抽象的原型角色所要求的接口。
原型模式的优势
1.允许动态得增加或减少产品类,由于创建产品类实例的方法是产品内部具有的,一次增加新产品对整个结构没有影响
2.提供简化的创建结构
3.具有给一个应用软件动态加载新功能的能力
4.产品类不需要非得有任何事先确定的等级结构,因为原型模式适用于任何等级结构,
原型模式的应用场景
1.当系统创建动态加载的对象并且产品具有一定的层次性时
2.当产品结构经常变化时
3.当需要复制一个现有的对象进行新对象生产时
具体示例
如下
源码
package model.prototype;
/*
* 原型类(以猪为例),注意要实现Cloneable接口
*/
public abstract class AbstractPig implements Cloneable{
public String pigName;
public String getPigName() {
return pigName;
}
public void setPigName(String pigName) {
this.pigName = pigName;
}
@Override
protected Object clone() throws CloneNotSupportedException {
try {
return super.clone();
} catch (Exception e) {
System.out.println("此对象不支持复制");
}
return null;
}
}
package model.prototype;
/*
* 给原型对象赋值
*/
public class SonPig extends AbstractPig {
public SonPig(){
setPigName("白猪");
}
}
package model.prototype;
/*
* 客户端程序
*/
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
AbstractPig pig = new SonPig();
System.out.println(pig.getPigName());
//通过对象的clone()方法,即可获得对象的一个copy
AbstractPig pig2 = (AbstractPig)pig.clone();
System.out.println("拷贝的"+pig2.getPigName());
}
}
原型模式与Spring
基于Spring框架的Bean ,可以在配置文件中用单例模式和原型模式进行创建方式进行 创建Bean
Bean 的配置的时候可以加上 scope="prototype"来设置为原型的方式创建 去这singleton=“true“是单例模式进行创建 Bean