大话设计模式之建造者模式
---为了理解建造者模式最近从网上看了很多资料,才在心中有个大概的概念,不过最近比较浮躁 看东西容易走神(大概因为天太热吧--借口"_")强行镇定了一波心情, 准备记录下建造者模式的笔记。(ps:设计模式的学习 挺枯燥的 不容易理解)
建造者模式
将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示
建造者模式涉及到的四个角色概念:
- 抽象建造者角色(Builder):提供一个接口,规范产品对象的建造,一般由子类实现。一般来说,产品的组成部分数与建造方法数相同,即有多少组成部分,就有多少个建造方法。
- 具体建造者角色(ConcreteBuilder):该角色实现了抽象建造者抽象建造者接口,主要是实现所有声明的方法以及返回建造好的产品实例。
- 指挥者角色(Director):负责调用具体建造者按照顺序建造产品。导演者只负责调度,真正执行的是具体建造者角色。
- 产品角色(Product):该角色是建造的复杂对象,提供基本方法。
接下来上代码理解吧(经典的造人案例)
具体要创建的产品
public class Person { private String head; private String body; private String hand; private String foot; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getHand() { return hand; } public void setHand(String hand) { this.hand = hand; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } }
抽象建造者角色
public interface IBuildPerson { //具体组成部分 void buildHead(); void buildBody(); void buildHand(); void buildFoot(); Person createPerson();//返回相应的创建对象 }
具体建造者1
public class Man implements IBuildPerson { Person person = new Person(); @Override public void buildHead() { person.setHead("男人"); } @Override public void buildBody() { person.setBody("身体"); } @Override public void buildHand() { person.setHand("手"); } @Override public void buildFoot() { person.setFoot("脚"); } @Override public Person createPerson() { return person; } }
具体建造者2
public class WoMen implements IBuildPerson { Person person = new Person(); @Override public void buildHead() { person.setHead("女人"); } @Override public void buildBody() { person.setBody("身体"); } @Override public void buildHand() { person.setHand("手"); } @Override public void buildFoot() { person.setFoot("脚"); } @Override public Person createPerson() { return person; } }
指挥者角色
public class Director { public Person createHumanByDirecotr(IBuildPerson iBuildPerson){ iBuildPerson.buildHead(); iBuildPerson.buildBody(); iBuildPerson.buildHand(); iBuildPerson.buildFoot(); return iBuildPerson.createPerson(); } }
mian方法测试--客户不知道具体建造过程
public class MainTest { public static void main(String[] args){ Director director = new Director(); Person person = director.createHumanByDirecotr(new Man()); Person person2 = director.createHumanByDirecotr(new WoMen()); System.out.println(person.getHead()+person.getBody()); System.out.println(person2.getHead()+person2.getBody()); } } //执行结果 男人身体 女人身体
到此代码示例结束!!!
建造者模式的优缺点
--优点:
1)降低代码耦合度。在建造者模式中,客户端不需要知道产品内部是如何实现的,我们只需得到产品的对象。并且使用导演者和建造者分离组装过程和组件具体构造过程,具有灵活的扩展性。
2)优秀的扩展性。具体建造者相互独立,方便扩展,符合开闭原则。
--缺点
1)一定的使用范围限制。建造者模式的产品的组件基本相同,如果产品的差异性较大,建造者模式就不适用了。
与工厂模式对比
建造者模式和工厂模式同样是创建一个产品,工厂模式就是一个方法,而建造者模式有多个方法,并且建造者模式是有顺序的执行方法。就是说建造者模式强调的是顺序,而工厂模式没有顺序一说。
工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个 产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。
建造者模式也是创建一个产品,但是不仅要把这个产品创建出来,还要关系这个产品的组成细节,组成过程。从代码上看,建造者模式在建造产品时,这个产品有很多方法,建造者模式会根据这些相同方法但是不同执行顺序建造出不同组成细节的产品