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

建造者模式的概念(概念部分摘自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;
    }

}

你可能感兴趣的:(尚学堂Java300集学习笔记)