23种设计模式之原型模式

原型模式中主要用到Cloneable这个接口,来实现浅拷贝,下面是具体内容:

原型模式的适用场合:

1、实际项目中很少单独出现,一般与工厂模式一起出现,通过clone创建对象,并由工厂方法提供给调用者使用;

2、如果这个类的初始化非常复杂,需要消耗较多的资源(数据,硬件资源);

3、资源优化、性能和安全有要求的场景;

4、通过new创建对象比较繁琐或者需要访问权限;

5;多人访问一个对象,多个调用者都需要修改其值,使用原型模式拷贝多个对象提供给调用者使用

优点:提高性能,逃避构造器的约束

缺点:

1、必须实现Cloneable接口;

2、实现克隆时,必须对该类的功能进行全盘考虑,尤其是已有的类,或者是该类不支持串行化的间接对象,或者引用含有循环结构的时候

代码实现:

1:创建一个实现Cloneable接口的抽象类

package prototype_pattern;


public abstract class Shape implements Cloneable {
private String id;
protected String type;
abstract void draw();
public String getType(){
return type;
}
public String getId(){
return id;
}
public void setId(String id){
this.id=id;
}
public Object clone(){
Object clone=null;
try{
clone=super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return clone;
}
}


2、创建扩展上面抽象类的实体类:Rectangle.java  Circle.java  Square.java

package prototype_pattern;


public class Rectangle extends Shape {
public Rectangle(){
type="Rectangle";
}
void draw(){
System.out.println("Rectangle");
}
}

package prototype_pattern;


public class Circle extends Shape{
void draw(){
System.out.println("Circle");
}
public Circle(){
type="Circle";
}
}

package prototype_pattern;


public class Square extends Shape {
void draw(){
System.out.println("Square");
}
public Square(){
type="Circle";
super.setId("2");
}
}


3:创建一个类,从数据库中获取实体类,并将它们保存在hashtable中

package prototype_pattern;


import java.util.Hashtable;


public class ShapeClone {
private static Hashtable <String,Shape> shapeMap = new Hashtable();
public static Shape getShape(String shapeId){
Shape cacheShape = shapeMap.get(shapeId);
return (Shape)cacheShape.clone();
}
public static void loadCache(){
Circle circle= new Circle();
circle.setId("1");
shapeMap.put(circle.getId(), circle);
Square square= new Square();
square.setId("2");
shapeMap.put(square.getId(), square);
Rectangle rectangle=new Rectangle();
rectangle.setId("3");
shapeMap.put(rectangle.getId(), rectangle);
}
}


4.测试demo

package prototype_pattern;


public class PrototypePatternDemo {
public static void main(String[] args) {
ShapeClone.loadCache();
Shape cloneShape = ShapeClone.getShape("1");
System.out.println("Shape:"+cloneShape.getType());
Shape cloneShape1 = ShapeClone.getShape("2");
System.out.println("Shape:"+cloneShape1.getType());
Shape cloneShape2= ShapeClone.getShape("3");
System.out.println("Shape:"+cloneShape2.getType());
}
}


5:运行结果


备注:

常说的浅拷贝:实现Cloneable接口,重写clone();

深拷贝:实现Serializable接口,读取二进制流



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值