1. 建造者模式
建造者模式将产品的结构和产品的零件的建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割开来,达到责任划分和包装的目的。
四个角色
抽象建造者角色,具体建造者角色,导演者角色,产品角色
package builder;
public class Product
{
//Anything pertaining to this product
}
package builder;
abstract public class Builder
{
public abstract void buildPart1();
public abstract void buildPart2();
public abstract Product retrieveResult();
}
package builder;
public class ConcreteBuilder extends Builder
{
private Product product = new Product();
public Product retrieveResult()
{
return product;
}
@Override
public void buildPart1()
{
// TODO Auto-generated method stub
}
@Override
public void buildPart2()
{
// TODO Auto-generated method stub
}
}
package builder;
public class Director
{
private Builder builder;
public void construct()
{
builder = new ConcreteBuilder();
builder.buildPart1();
builder.buildPart2();
builder.retrieveResult();
}
}
什么情况下使用:
1.需要生成的产品对象有复杂的内部结构; 2.需要生成的产品对象的属性相互依赖;3.在对象创建过程中会使用到系统中的其他的一些对象,这些对象在产品对象的创建过程中不易得到。 a.
2. 原始模型模式
原始模型模式属于对象的创建模式,通过给出一个原型对象来指明所要创建的对象的类型,然后用复用这个原型对象的办法创建出更多的同类型的对象。这就是原型模式的用意。
2.1) 原始模型模式分为简单形式和登记形式
如果需要创建的原型对象数目较少而且比较固定的话,可以采取第一种形式,也即简单形式的原始模型模式。在这种情况下,原型对象的引用可以由客户端自己保存。
如果要创建的原型对象数目不固定的话,可以采用登记形式,也即登记形式的原始模型模式。在这种情况下,客户端并不保存对原型对象的引用,这个任务交给管理员对象。在复制一个原型对象之前,客户端可以查看管理员对象是否已存在一个满足要求的原型对象。如果有,可以直接从管理员类取得对这个对象的引用;如果没有,客户端就要自己复制此原型对象。
package prototype;
public interface Prototype extends Cloneable
{
public Prototype clone();
}
package prototype;
public class ConcretePrototype implements Prototype
{
public Prototype clone()
{
try
{
return (Prototype)super.clone();
}
catch (CloneNotSupportedException e)
{
return null;
}
}
}
package prototype;
public class Client
{
private Prototype prototype;
public void operation(Prototype example)
{
Prototype p = example.clone();
}
}
登记形式
package prototype;
public interface Prototype extends Cloneable
{
public Object clone();
}
package prototype;
public class ConcretePrototype implements Prototype
{
public synchronized Object clone()
{
Prototype temp = null;
try
{
temp = (Prototype)super.clone();
return temp;
}
catch (CloneNotSupportedException e)
{
System.out.println("Clone failed.");
}
finally
{
return temp;
}
}
}
package prototype;
import java.util.Vector;
public class PrototypeManager
{
private Vector<Prototype> objects = new Vector<Prototype>();
public void add(Prototype prototype)
{
objects.add(prototype);
}
public Prototype get(int i)
{
return (Prototype)objects.get(i);
}
public int getSize()
{
return objects.size();
}
}
package prototype;
public class Client
{
private PrototypeManager mgr;
private Prototype prototype;
public void registrPrototype()
{
prototype = new ConcretePrototype();
Prototype copyPrototype = (Prototype)prototype.clone();
mgr.add(copyPrototype);
}
}
克隆需要满足的条件:
1)对任何的对象x, 都有x.clone() != x。换言之,克隆对象与原对象不是同一个对象;
2)对任何的对象x, 都有x.clone() .getclass() == x.getclass()。换言之,克隆对象与原对象的类型一样;
3)如果对象x的equals()方法定义恰当的话,那么x.clone().equals(x)应当成立的;
3.JavaBean 的冷藏和解冻