二十三种设计模式之原型模式

发布于:2024-09-17 ⋅ 阅读:(56) ⋅ 点赞:(0)

一.什么是原型模式

原型模式是一种创建型对象设计模式,它通过复制一个已经创建的实例(即原型对象)来创建一个和原型对象相同的新对象。‌ 这种模式在面向对象软件设计中非常有用,因为它允许通过复制现有对象来快速生成多个相似的对象,而无需重新初始化每个对象。原型模式的工作原理是将一个原型对象传给需要创建新对象的类,该类通过请求原型对象的拷贝来实现创建过程。

二.原型模式的类图

三.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 stub
	product 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 stub
	product 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("");
}
}

参考答案:

习题6-2答案


网站公告

今日签到

点亮在社区的每一天
去签到