Java设计模式(五)原型模式

一、定义

        原型模式属于对象创建模式, GOF 给它的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

        在 Java 中提供了 clone()方法来实现对象的克隆,所以 Prototype 模式实现变得简单许多。 注: clone()方法的使用,请参考《Thinking in Java》或者《Effective Java》,对于许多原型模式中讲到的浅克隆、深克隆,本文不作为谈论话题

二、何时使用

        原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

三、实例

package Prototype;

public class Shape implements Cloneable{
	private int id;
	protected String type;
	
	public Object clone(){
		Object obj = null;
		try {
			obj = super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return obj;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getType() {
		return type;
	}
}

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

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

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

import java.util.Hashtable;

public class Shapecache {
	public static Hashtable<Integer,Shape> cachemap = new Hashtable<Integer,Shape>();
	public Shape getshape(int id){
		return (Shape) cachemap.get(id).clone();
	}
	public void cacheinit(){
		Circle c = new Circle();
		c.setId(1);
		cachemap.put(1, c);

		Square s = new Square();
		s.setId(2);
		cachemap.put(2, s);
		
		Rectangle r = new Rectangle();
		r.setId(3);
		cachemap.put(3, r);
	}
}
package Prototype;

public class Client {
	public static void main(String[] args){
		Shapecache sc = new Shapecache();
		sc.cacheinit();
		Shape shape1 = sc.getshape(1);
		System.out.println(shape1.getType()+" "+shape1.getId());
		Shape shape2 = sc.getshape(2);
		System.out.println(shape2.getType()+" "+shape2.getId());
		Shape shape3 = sc.getshape(3);
		System.out.println(shape3.getType()+" "+shape3.getId());
	}
}
//输出结果:
circle 1
Square 2
Rectangle 3

这里面有4个角色:

  • 抽象原型角色:实现了自己的 clone 方法,扮演这种角色的类通常是抽象类,且它具有许多具体的子类。
  • 具体原型角色:被复制的对象,为抽象原型角色的具体子类。
  • 缓存器: 让一个原型克隆自己来得到一个新对象。
  • 客户角色:调用缓存器。



猜你喜欢

转载自blog.csdn.net/duan_2018/article/details/79901549