一.什么是原型模式
原型模式是一种创建型对象设计模式,它通过复制一个已经创建的实例(即原型对象)来创建一个和原型对象相同的新对象。 这种模式在面向对象软件设计中非常有用,因为它允许通过复制现有对象来快速生成多个相似的对象,而无需重新初始化每个对象。原型模式的工作原理是将一个原型对象传给需要创建新对象的类,该类通过请求原型对象的拷贝来实现创建过程。
二.原型模式的类图
三.cloneable接口
对于深拷贝和浅拷贝不是很理解的,可以参考下面的文章
参考博文:cloneable详细说明
cloneable接口存在于java.lang包中
官方手册解释
总之,cloneable是浅拷贝,在对引用类型进行拷贝时,对于引用类型成员变量来说,原型和复制品的地址都是同一个,这样就会造成要改全部改的情况。这时候就要重新开辟空间,实现深拷贝。
四.实例
创建一个输出框样式,使得打印的样式不同。有两种样式一种是下划线,另一种是四边都有框。其中,cloneable接口的实现是关键。product类实现了cloneable接口,underlinpen和MessageBox继承了product类,这样就可以调用clone方法复制开辟的对象空间,而不需要重新分配。
Manager.java
package framework;
import java.util.*;
public class Manager {
private HashMap showcase=new HashMap();
public void register(String name,product pro) {showcase.put(name, pro);
}
public product create(String pro) {product p=(product)showcase.get(pro);return p.createClone();
}
}
product.java
package framework;public interface product extends Cloneable{
public abstract void use(String s);
public abstract product createClone();
}
MessageBox.java
package style;
import framework.*;
public class MessageBox implements product{
private char decochar;
public MessageBox(char decochar) {this.decochar=decochar;
}
public void use(String s) {int length=s.getBytes().length;for(int i=0;i<length+4;i++) {System.out.print(decochar);}System.out.println("");System.out.println(decochar+" "+s+" "+decochar);for(int i=0;i<length+4;i++) {System.out.print(decochar);}System.out.println("");
}
@Override
public product createClone() {// TODO Auto-generated method stubproduct p=null;try {p=(product)clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return p;
}
}
underlinepen.java
package style;
import framework.*;
public class underlinepen implements product{
private char ulchar;
public underlinepen(char ulchar) {this.ulchar=ulchar;
}
public void use(String s) {int length=s.getBytes().length;System.out.println("'\'"+s+"\"");for(int i=0;i<length+4;i++) {System.out.print(ulchar);}System.out.println("");
}
@Override
public product createClone() {// TODO Auto-generated method stubproduct p=null;try {p=(product)clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return p;
}
}
输出结果:
五.为什么要使用原型模式?
原型模式的适用情况:
1.对象种类繁多,无法将它们整合到一个类中。
2.难以根据类生成实例时
3.想解耦框架,生成实例时
原型模式是一种创建型对象设计模式,它允许通过复制已有对象来创建新对象,而不需要使用显式的构造函数调用来创建。这种模式特别适用于对象创建成本较高或耗时较长的场景,通过复制一个现有对象的属性和方法来创建新对象,从而避免了昂贵的创建过程。
六.习题
习题6-1
我的答案:
将product改为c抽象类实现cloneable接口,将createClone方法写入product内。MessageBox和UnderlinePan继承product类。
product.java
package framework;public abstract class product implements Cloneable{
public abstract void use(String s);
public product createClone() {product p=null;try {p=(product)clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return p;
}
}
MessageBox.java
package style;
import framework.*;
public class MessageBox extends product{
private char decochar;
public MessageBox(char decochar) {this.decochar=decochar;
}
public void use(String s) {int length=s.getBytes().length;for(int i=0;i<length+4;i++) {System.out.print(decochar);}System.out.println("");System.out.println(decochar+" "+s+" "+decochar);for(int i=0;i<length+4;i++) {System.out.print(decochar);}System.out.println("");
}}
underlinePan.java
package style;
import framework.*;
public class underlinepen extends product{
private char ulchar;
public underlinepen(char ulchar) {this.ulchar=ulchar;
}
public void use(String s) {int length=s.getBytes().length;System.out.println("'\'"+s+"\"");for(int i=0;i<length+4;i++) {System.out.print(ulchar);}System.out.println("");
}
}
参考答案: