生成器模式
设计模式的原则:尽量暴漏在主程序里面的代码扩展性强一些,多用接口和虚拟类,少用实现类,这样再改程序的时候就方便的多了。
1、作用:一个Product类的产生需要多个其他的类Unit顺序生成之后组合而成,而且这些Unit的产生方法是不固定的。
举例而言一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出。有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义。在某个性质没有赋值之前,另一个性质则无法赋值。这些情况使得性质本身的建造涉及到复杂的商业逻辑。这时候,此对象相当于一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程就是组合零件的过程。由于组合零件的过程很复杂,因此,这些"零件"的组合过程往往被"外部化"到一个称作建造者的对象里,建造者返还给客户端的是一个全部零件都建造完毕的产品对象。(摘抄自http://www.cnblogs.com/lds85930/articles/643143.html)
2、类图:
3、实现
(1)Unit定义单元
public class Unit { String type = null; public Unit(String type) { this.type = type; } public String getInfo() { return type; } }
(2)IBuider 定义组成单元的流程 并且返回Product
public interface IBuilder { public void createOne(); public void createTwo(); public Product getProduct(); }
(3)IBuilderOne 是IBuilder的实现类,定义了单元组成Product的一种方式
public class IBuilderOne implements IBuilder { Product p = new Product(); @Override public void createOne() { p.one = new Unit("In first one"); } @Override public void createTwo() { p.two = new Unit("In first two"); } @Override public Product getProduct() { return p; } }
(4)IBuilderTwo 是IBuilder的实现类,定义了单元组成Product的另外一种方式
public class IBuilderTwo implements IBuilder { Product p = new Product(); @Override public void createOne() { p.one = new Unit("In Second one"); } @Override public void createTwo() { p.two = new Unit("In Second two"); } @Override public Product getProduct() { return p; } }
(5)Director 定义了用哪一种IBuilder 并且返回Product
public class Director { IBuilder builder; public Director(IBuilder builder) { this.builder = builder; } public Product getProduct() { builder.createOne(); builder.createTwo(); return builder.getProduct(); } public static void main(String[] args) { IBuilder builder = new IBuilderTwo(); Director director = new Director(builder); Product product = director.getProduct(); product.showInfo(); } }
(6)Product类,定义了Product需要哪些原件进行组合
public class Product { Unit one; Unit two; public void showInfo() { System.out.println(one.getInfo()+"-->"+two.getInfo()); } }