原型模式与创建者模型

原型模式就是利用克隆来实现对象的复制,它适用于这种情况:需要一个和已有的对象“长的很像”的对象。比较简单吧。

class A{
	String name;
	int age;
	boolean sex;//man true;female false
	int grade;
	public A(){
		name = "zhangsan";
		age = 20;
		sex = true;
		grade = 3;
	}
	
//	getter and setter
	
	public A clone(){		
		return new A();
	}
}

使用clone():

public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a = new A();
		A aa = a.clone();
		a.name = "lisi";
	}

有一个A对象a,如果需要一个和a只是名字不同的对象,则可以克隆一个a,然后改改名字就可以了。

可能,A类中的属性也是引用类型的,而且其属性还持有别的引用,如此递归下去。这种情况下使用以上方法就不可行了。在java中提供了序列化机制,只要是实现了Serializable接口的类都可以被序列化,这样我们就可以重写出更好用的clone()了。如:

class Test implements Serializable{
	B b = new B();
	
	public Object deepClone()throws IOException, ClassNotFoundException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(bos);		
		oos.writeObject(this);
		
		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bis);
		Test2 test = (Test2)ois.readObject();
		return test;
	}
}
class B implements Serializable{
	
}

如此一来,只要调用deepClone()就可以创建出全新的一个对象了。要注意的是,如果要序列化的某个类中有引用类型没有实现Serializable接口,程序就会抛出异常了。


以上就是原型模式,接下来说说建造者模式。

建造者模式也不常见,也就不细说了。直接上代码吧

class Product{
	String part1;
	String part2;
	String part3;
	String part4;
}
class Derector{
	AbstractBuilder a;
	public Derector(){
		
	}
	public Derector(AbstractBuilder a){
		this.a = a;
	}
	public Product construct(){
		a.buildPart1();
		a.buildPart2();
		a.buildPart3();
		a.buildPart4();
		return a.getResult();
	}
}
abstract class AbstractBuilder{
	protected Product product = new Product();
	
	abstract void buildPart1();
	abstract void buildPart2();
	abstract void buildPart3();
	abstract void buildPart4();
	
	public Product getResult(){
		return product;
	}
}
class Builder1 extends AbstractBuilder{

	@Override
	public void buildPart1() {
		// TODO Auto-generated method stub
		product.part1 = "以方式一创建 part 1";
	}

	@Override
	public void buildPart2() {
		// TODO Auto-generated method stub
		product.part2 = "以方式一创建 part 2";
	}

	@Override
	public void buildPart3() {
		// TODO Auto-generated method stub
		product.part3 = "以方式一创建 part 3";
	}

	@Override
	public void buildPart4() {
		// TODO Auto-generated method stub
		product.part4 = "以方式一创建 part 4";
	}
	
}

class Builder2 extends AbstractBuilder{

	@Override
	public void buildPart1() {
		// TODO Auto-generated method stub
		product.part1 = "以方式二创建 part 1";
	}

	@Override
	public void buildPart2() {
		// TODO Auto-generated method stub
		product.part2 = "以方式二创建 part 2";
	}

	@Override
	public void buildPart3() {
		// TODO Auto-generated method stub
		product.part3 = "以方式二创建 part 3";
	}

	@Override
	public void buildPart4() {
		// TODO Auto-generated method stub
		product.part4 = "以方式二创建 part 4";
	}
	
}

代码比较长,但挺简单。不说了。

到此为止,已经学习了五个设计模式,这五个被归为一类:创建型设计模式。学完了这五个设计模式,可以明显的发现,要让系统具有较好的可扩展性,就要面向抽象编程,只有这样,才能“以不变应万变”,越是抽象的东西适用范围越广啊,真是没错呢。

接下来就是结构性设计模式了。

展开阅读全文

没有更多推荐了,返回首页