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

一.什么是原型模式

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

二.原型模式的类图

三.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答案

设计模式是在软件设计过程中,对于常见问题的解决方案的总结和模板化的提炼。Java语言中广泛应用的设计模式有23,分为三个大类:创建型模式、结构型模式和行为型模式。 首先是创建型模式,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。单例模式确保一个类只有一个实例化对象,简单工厂模式通过一个工厂类来创建对象,工厂方法模式通过使用工厂接口来创建对象,抽象工厂模式为一个产品族提供创建对象的接口,建造者模式逐步构建一个复杂对象,原型模式通过复制现有对象来创建新对象。 其次是结构型模式,包括适配器模式、桥接模式、装饰器模式、组合模式、外观模式、享元模式和代理模式。适配器模式用于将一个接口转换成客户端所期待的接口,桥接模式将抽象和实现解耦,装饰器模式动态地给对象添加额外职责,组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,外观模式提供了一个简化客户端调用复杂子系统的接口,享元模式通过共享对象来有效地支持大量细粒度的对象,代理模式为其他对象提供一代理以控制对这个对象的访问。 最后是行为型模式,包括模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式和访问者模式。模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现,命令模式将请求封装成一个对象,以使不同的请求能够参数化客户端对象,迭代器模式提供一访问容器对象中各个元素的方式,观察者模式定义了对象之间的一对多依赖,中介者模式用一个中介对象来封装一系列对象的交互,备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,解释器模式给定一个语言,定义它的文法的一表示,并定义一个解释器,状态模式允许一个对象在其内部状态改变时改变它的行为,策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,以使得算法的变化不影响到使用算法的客户,访问者模式可以在不改变数据结构的前提下,定义作用于这个结构元素的新操作。通过使用这些设计模式,可以提高软件系统的可维护性、可扩展性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值