您的位置:首页 > 编程语言 > Java开发

232_尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】_建造者模式详解

2015-06-10 22:38 776 查看
建造者模式的概念(概念部分摘自http://www.cnblogs.com/devinzhang/archive/2012/01/06/2314670.html):

  将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示]

  与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。

  建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。

  举个简单的例子,如汽车,有很多部件,车轮,方向盘,发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一部汽车,这个装配过程也很复杂(需要很好的组装技术), builder模式就是为了将部件和组装分开。

  

(以上为摘录)

以下为根据视频学习所写的例子:

package hong.study.builder;
/**
* 通过创建者模式创建的飞船,可以看出暴露给用户的代码是很少的
* @author Hong
*
*/
public class Client {
public static void main(String[] args) {
AirshipDirector ad = new HongAirshipDirector();
Airship as = ad.directAirship();
System.out.println(as.getEngine().getName());
}
}
/**
运行结果:
HongEngine
*/


package hong.study.builder;
/**
* 飞船实例,包括飞船必要的部分(这里瞎写的)
* 但是不同的部分如何实现是不同的
* 这里只是通过一个name作为标定不同的实现
* 不同公司的飞船都需要这些组件,但是组件会有自己公司的名字
* @author Hong
*
*/
public class Airship {
private Engine engine;//可以应用到工厂模式来生产对象
private Room room;
private Toilet toilet;

public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public Room getRoom() {
return room;
}
public void setRoom(Room room) {
this.room = room;
}
public Toilet getToilet() {
return toilet;
}
public void setToilet(Toilet toilet) {
this.toilet = toilet;
}
}
class Engine{
private String name;
public Engine() {
super();
}
public Engine(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Room{
private String name;

public Room() {
super();
}
public Room(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Toilet{
private String name;

public Toilet() {
super();
}
public Toilet(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}


package hong.study.builder;
/**
* 建造者接口,创建飞船的各个组件,与具体的建造细节分离
* @author Hong
*
*/
public interface AirshipBuilder {
Engine buildEngine();
Room buildRoom();
Toilet buildToilet();
}


package hong.study.builder;
/**
* 如何组装飞船的指导者,虽然飞船都需要必要的组件
* 但是这些组件如何组装,例如组装的顺序,接口如何对接等
* 是通过指导者来实现的,组装方法返回一个完整的飞船
* @author Hong
*
*/
public interface AirshipDirector {
Airship directAirship();
}


package hong.study.builder;
/**
* Hong公司生产的飞船的组件
* @author Hong
*
*/
public class HongAirshipBuilder implements AirshipBuilder{

@Override
public Engine buildEngine() {
return new Engine("HongEngine");
}

@Override
public Room buildRoom() {
return new Room("HongRoom");
}

@Override
public Toilet buildToilet() {
return new Toilet("HongToilet");
}

}


package hong.study.builder;
/**
* Hong公司的指导者组装出的飞船
* @author Hong
*
*/
public class HongAirshipDirector implements AirshipDirector{

private AirshipBuilder hab;

public HongAirshipDirector() {
super();
this.hab = new HongAirshipBuilder();
}

@Override
public Airship directAirship() {
Airship as = new Airship();
as.setEngine(hab.buildEngine());
as.setRoom(hab.buildRoom());
as.setToilet(hab.buildToilet());

return as;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息