"建造者模式"-之Java,Android面试必问设计模式(4/9)
来源:互联网 发布:java计算程序运行时间 编辑:程序博客网 时间:2024/06/05 05:25
建造者模式
这是我给大家介绍的8个面试必问的设计模式的第四类:建造者模式.学完这8类必会的那么面试就不会有什么问题了,其余的无非都是多态的演变.好的开始讲解第四类:
我将通过两个案例给大家讲解,第一个案例起码70%以上的人看了都理解了,如果还不理解,请继续看第二个案例,看完后95%的人都会理解,还剩5%的人睡个觉起来就理解了.
大家不要只需要理解成:比工厂模式多了个”指挥者”角色.
通俗理解:
建造者模式,就是用户只和指挥者交谈拿产品,指挥者也只和建造者拿产品,制造过程由建造者具体去做好.
具体的方法参数:
1.产品”类”product
2.建造者接口Builder
建造的各种方法123,还有一个获取(返回)产品的方法
3.具体”建造者类ConcreateBuilder”继承接口.
各种具体的方法4.指挥者”类”Director
里面有一个获取产品的方法-传入接口实例,返回值”产品类”的,为了指向子类.调用所有的接口的方法,最后返回的是接口最后获取产品的方法即可.
1.详细概念
1.将一个复杂的构建(方法内容)与其表示(方法)相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示]
2.与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。
3.建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。
4.举个简单的例子,如汽车,有很多部件,车轮,方向盘,发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一部汽车,这个装配过程也很复杂(需要很好的组装技术), builder模式就是为了将部件和组装分开。
例子1,造人
/** * 建造者模式必备内容(按模板来才是标准的): * * 1.产品"类"-Product * 2.建造者Builer"接口"-Builder 1.多个制造产品部分的方法 2.返回一个完整的"产品"的方法 * 3.建造者的"具体实现"-"类"-ConcreteBuilder * 1.完成具体的造部分的方法 * 2.把所有部分组合成"产品"的方法 * 4.指挥者"类"-Director,获取产品 * 1.传入一个建造者接口的实例对象(用户只要传入想要的,用户只和指挥者接触) * 2.对象调用方法(符合多态) * 3.返回产品即可 * 5.用户就是Test * 1.直接通过指挥者,指定创建的类型即可获取产品 *//*--------------Product--------------*//** * 人,产品"类" */class Person{ private String head; private String body; private String foot; public void setHead(String head) { this.head = head; } public void setBody(String body) { this.body = body; } public void setFoot(String foot) { this.foot = foot; } @Override public String toString() { return head+"\n\r"+body+"\n\r"+foot; } public void detail() { System.out.println(toString()); }}/*--------------Builder--------------*//** * 建造者"接口" * 1.多个制造产品部分的方法 * 2.返回一个完整的"产品" */interface PersonBuilder { //造人器官的方法 void buildHead(); void buildBody(); void buildfoot(); //造人,得到人方法 Person builPerson();}/*--------------ConcreatBuilder--------------*//** * 建造者接口的具体实现"类" * 比如建的是男人类,继承建造者接口 */class ManPersonBuilder implements PersonBuilder { //创建一个产品,然后下面加工 Person person = new Person(); @Override public void buildHead() { person.setHead("建造头部"); } @Override public void buildBody() { person.setBody("建造了身体"); } @Override public void buildfoot() { person.setFoot("建造了脚"); } //返回完整的一个产品类 @Override public Person builPerson() { return person; }} /*--------------Director--------------*//** * 指挥者类: * 1.传入一个建造者接口的实例对象(用户只要传入想要的,用户只和指挥者接触),并返回类型是产品的方法,等下直接给用户 * 2.对象调用方法(符合多态) * 3.返回产品即可 */class PersonDirector { public Person constructPerson(PersonBuilder builder) { builder.buildHead(); builder.buildBody(); builder.buildfoot(); return builder.builPerson();//返回产品 }}/**//测试代码:就是用户 * 1.直接通过指挥者,指定创建的类型即可获取产品 */public class Test { public static void main(String[] args) { PersonDirector director = new PersonDirector(); Person person = director.constructPerson(new ManPersonBuilder()); person.detail(); }}
打印结果:
建造头部建造了身体建造了脚
如果大家觉得不过瘾,那么再通过一个例子帮你完全理解
例子2,造汽车
//1.产品"类"class Car{ String name; int wheel; int seat; String color; boolean isOpenTop;//开天窗 public void setName(String name) { this.name = name; } public void setWheel(int wheel) { this.wheel = wheel; } public void setSeat(int seat) { this.seat = seat; } public void setColor(String color) { this.color = color; } public void setIsOpenTop(boolean isOpenTop) { this.isOpenTop = isOpenTop; } @Override public String toString() { return "车名 : "+name + "\r\n" +"轮胎数 : "+wheel+"\r\n" +"座位数 : "+seat + "\r\n" +"颜色 : "+color+"\r\n" +"是否敞篷 : "+isOpenTop+"\r\n" ; } public void detail() { System.out.println(toString()); }}//建造者"接口",统一用build,好理解interface Builder { void builName();//取名方法 void buildWheel(); void buildSeat(); void buildColor(); void buildTopOpen(); //获取一个产品-车的方法,关键******* Car buildCart();}/** * 具体建造者接口的实现"类" */class ConcreatBuilder implements Builder { //创建产品 Car car = new Car(); String name; public ConcreatBuilder(String name) { this.name = name; if (!isOdiOrBance()) { System.out.println("抱歉,不接受此车型订单"); } } public boolean isOdiOrBance() { if (!name.equals("奥迪")&&!name.equals("奔驰")) {//不是这型号的不接受订单 return false; } return true; } @Override public void builName() { if(isOdiOrBance()) car.setName(name); } @Override public void buildWheel() { if(isOdiOrBance()) car.setWheel(4); } @Override public void buildSeat() { if(!isOdiOrBance()) return; //奥迪8座,奔驰6座 if (name.equals("奥迪")) { car.setSeat(8); } else if (name.equals("奔驰")) { car.setSeat(6); } } @Override public void buildColor() { if(!isOdiOrBance()) return; //奥迪红色 if (name.equals("奥迪")) { car.setColor("read"); } else if (name.equals("奔驰")) { car.setColor("black"); } } @Override public void buildTopOpen() { if(!isOdiOrBance()) return; //奥迪不敞篷 if (name.equals("奥迪")) { car.setIsOpenTop(false); } else if (name.equals("奔驰")) { car.setIsOpenTop(true); } } @Override public Car buildCart() { return car; } }//指挥者"类"class Director { //一个获取(返回)产品的方法,传入的是"接口"的具体实现类对象,符合多态,并调用接口的方法,返回值也是 public Car constructBuilder(Builder builder) { builder.builName(); builder.buildColor(); builder.buildWheel(); builder.buildSeat(); builder.buildTopOpen(); return builder.buildCart(); //关键,和上述的同步 }}/** * 用户,只和指挥者交谈 * 就是只拿商品 */public class User { public static void main(String[] args) { //用户通过指挥者获取产品 Director director = new Director(); Car car = director.constructBuilder(new ConcreatBuilder("奥迪")); car.detail(); System.out.println("------------------------------------------"); Car car2 = director.constructBuilder(new ConcreatBuilder("奔驰")); car2.detail(); Car car3 = director.constructBuilder(new ConcreatBuilder("奇瑞")); car3.detail(); }}
打印结果:
车名 : 奥迪轮胎数 : 4座位数 : 8颜色 : read是否敞篷 : false------------------------------------------车名 : 奔驰轮胎数 : 4座位数 : 6颜色 : black是否敞篷 : true抱歉,不接受此车型订单车名 : null轮胎数 : 0座位数 : 0颜色 : null是否敞篷 : false
0 0
- "建造者模式"-之Java,Android面试必问设计模式(4/9)
- "享元模式"-之Java,Android面试必问设计模式(9/9)
- "工厂模式"-之Java,Android面试必问设计模式(1/9)
- "抽象工厂模式"-之Java,Android面试必问设计模式(2/9)
- "单例模式"-之Java,Android面试必问设计模式(3/9)
- "适配器模式"-之Java,Android面试必问设计模式(5/9)
- "装饰模式"-之Java,Android面试必问设计模式(6/9)
- "策略模式"-之Java,Android面试必问设计模式(7/9)
- "观察者模式"-之Java,Android面试必问设计模式(8/9)
- android设计模式之建造者模式
- Android设计模式之建造者模式
- java设计模式之建造者模式
- java设计模式之建造者模式
- java设计模式之建造者模式
- 【Java设计模式】之建造者模式
- java设计模式之建造者模式
- Java--设计模式之建造者模式
- java设计模式之-建造者模式
- visaual stdio 2012 相关快捷键
- Java 中基本类型和包装类之间的转换
- 填坑
- java NIO和BIO的网上介绍总结
- [从头读历史] 第270节 诗经 王风
- "建造者模式"-之Java,Android面试必问设计模式(4/9)
- 单片机驱动DM9000网卡芯片(详细调试过程)【上】
- php发送短信(调用网易云信实现)
- Python yield 使用浅析
- java list去重
- Java实现冒泡排序
- 单片机驱动DM9000网卡芯片(详细调试过程)【下】
- java 8的十大新特性分析
- Java核心API列表