原型模式
原型模式定义:
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
原型模式的例子:
- java 中 clone()方法
- 打印机通过PDF文件打印出多份纸质书籍
原型模式就是通过已有对象创建出相同或者相似的多个对象;
原型模式的角色
- 抽象原型类:规定了具体原型对象必须实现的接口。
- 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
- 访问类:使用具体原型类中的 clone() 方法来复制新的对象。
使用场景
- 资源优化
- 类初始化需要消耗资源
- 性能、安全
- new 对象时需要繁琐的数据准备
- 一个对象多个修改者
案例
案例描述
使用原型模式对某配置文件类生成多份配置文件
解决思路
- 新建配置文件对象(Property),实现Cloneable接口。
- 新建配置文件工厂,并使用原型模式实现获取对象实例方法
示例代码
-
配置类
@Data @AllArgsConstructor public class Property implements Cloneable{ /** * 语言 */ private String language; /** * 单词 */ private String word; @Override public Property clone(){ Property result = null; try { result = (Property) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return result; } @Override public String toString(){ return String.format("language:%s,word:%s",this.language,this.word); } }
-
配置工厂类
public class PropertyFactory { private static final Property property = new Property("english","hello"); public static Property getInstance(){ return property.clone(); } }
-
测试类
public class ProtoTypeTest { @Test public void test(){ Property property1 = PropertyFactory.getInstance(); Property property2 = PropertyFactory.getInstance(); System.out.println(property1); System.out.println(property2); System.out.println("property1 == property2 ?" + (property1 == property2)); } }
-
测试结果
language:english,word:hello
language:english,word:hello
property1 == property2 ?false
Github 地址
https://github.com/duanqiangk/DesignPatternDemo.git