设计模式:建造者模式

  一个产品通常由不同的组成成分构成,这些成分构成产品的内部表象。不同的产品有不同的内部表象,也就时不同的成分。

建造者模式使客户端不关注产品的具体成分,只需要关注具体的产品。建造者对象返回给客户端的是一个由零件所构成的完全对象。

场景:建造者模式实现构建和装配的解耦,不同的构建器,相同的装配方法,构建出不同的对象。

  比如:StringBuild的append方法, SAX解析中的SaxBuilder等。

/**
 * 比如一个苹果手机产品,由摄像头,系统,cpu构成
 */
public class Iphone {
    //摄像头
    private Camera camera;
    //系统
    private Ios Ios;
    //cpu
    private AppleChip appleChip;

    public Iphone(Camera camera, com.test.game.design.build.Ios ios, AppleChip appleChip) {
        this.camera = camera;
        Ios = ios;
        this.appleChip = appleChip;
    }
}

class Camera {
    private String name;

    public Camera(String name) {
        this.name = name;
    }

}

class AppleChip {
    private String name;

    public AppleChip(String name) {
        this.name = name;
    }
}

class Ios {
    private String name;

    public Ios(String name) {
        this.name = name;
    }

}

  

/**
 * 创建一个构建者 构建 产品零件
 */

public interface IphoneBuilder {

    Camera builderCamera();

    Ios buildIos();

    AppleChip buildAppleChip();
}

  

/**
 * 生产苹果零件
 */
public class ChinaIphoneBuilder implements IphoneBuilder{


    @Override
    public Camera builderCamera() {
        System.out.println("生产苹果摄像头");
        return new Camera("camera");
    }

    @Override
    public Ios buildIos() {
        System.out.println("生产苹果IOS系统");
        return new Ios("IOS");
    }

    @Override
    public AppleChip buildAppleChip() {
        System.out.println("生产苹果CPU");
        return new AppleChip("cpu");
    }
}

 

/**
 * 组装Iphone
 */
public interface IphoneDirector {

    Iphone createIphone();
}

  

/**
 * 生产产品
 */
public class ChinaIphoneDirector implements IphoneDirector{

    private IphoneBuilder builder;

    public ChinaIphoneDirector(IphoneBuilder builder) {
        this.builder = builder;
    }

    @Override
    public Iphone createIphone() {
        return new Iphone(builder.builderCamera(), builder.buildIos(), builder.buildAppleChip());
    }
}

  

/**
 * 模拟调用
 */
public class Client {
    public static void main(String[] args) {
        IphoneDirector director = new ChinaIphoneDirector(new ChinaIphoneBuilder());
        Iphone iphone = director.createIphone();
    }
}

 

建造者模式包含以下角色:

  抽象建造者(IphoneBuilder): 抽象产品零件的构造

  具体建造者(ChinaIphoneBuilder):生产具体产品的零件

  调用者(director):调用建造者,创建产品

  具体产品(Iphone)。

 建造者模式和抽象工厂模式非常相似,都能解决由多个对象构成具体产品的问题。但实际上还是存在区别

抽象工厂中每一次工厂对象被调用时都返回一个完整的对象,而调用者可能会使用这个对象,也有可能作用

与其他的对象。也就是工厂产生的对象可能不是最终对象,也可能是。而建造者模式则不同,生成的对象是

完整的。生成的过程发生在建造者内部。可以由抽象工厂来生成建造者模式需要的对象。

posted @ 2018-12-20 21:15  小阿Q的博客  阅读(144)  评论(0编辑  收藏  举报