设计模式之建造者模式(Builder)

建造者模式

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

介绍

    意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
    主要解决:主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
    何时使用:一些基本部件不会变,而其组合经常变化的时候。
    如何解决:将变与不变分离开。
    关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
    应用实例: 1、JAVA 中的 StringBuilder;2、EventBus对象的创建。
    优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
    缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
    使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
    注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

框架

            这里写图片描述

    在建造者模式中有四个成员:

        - Director:与用户直接交互,掌控Build的顺序,调用Builder中创建对象的方法;
        - Builder:各对象创建的方法类,实现ConcreteBuilder接口中定义的创建方法;
        - ConcreteBuilder:对象创建接口,将产品各部件的创建方法抽象到接口中;
        - Product:产品类,即最终要build的生成物。

实例

    接下来通过一个实例来演示建造者模式的工作方法,该实例通过建造者模式创建一个完整的IPhone对象:

1、定义产品类 IPhone

    IPhone中有Screen、MainBroad、CPU、Camera四个零件(此处简化都为String对象,在复杂情况下每个部件都应该是一个类,并且有自己的创建方法和顺序)。

/**
 * Created by wise on 2018/6/14.
 */
public class IPhone {
    private String mScreen;
    private String mMainBroad;
    private String mCPU;
    private String mCamera;

    public String getScreen() {
        return mScreen;
    }

    public void setScreen(String screen) {
        mScreen = screen;
    }

    public String getMainBroad() {
        return mMainBroad;
    }

    public void setMainBroad(String mainBroad) {
        mMainBroad = mainBroad;
    }

    public String getCPU() {
        return mCPU;
    }

    public void setCPU(String CPU) {
        mCPU = CPU;
    }

    public String getCamera() {
        return mCamera;
    }

    public void setCamera(String camera) {
        mCamera = camera;
    }
}

2、抽象IPhoneBuild接口(ConcreteBuilder角色)

    IPhoneBuild中把建造IPhone的过程抽象为接口,共有5个方法,分别是各模块的建造方法和最后生成物的建造方法。

/**
 * Created by wise on 2018/6/14.
 */

public interface IPhoneBuild {
    public void buildScreen();
    public void buildMainBroad();
    public void buildCPU();
    public void buildCamera();

    public IPhone buildIPhone();
}

3、IPhoneBuild接口实现(Builder角色)

    然后在IPhoneBuilder中对上述接口进行具体实现,各模块和生成物的详细建造逻辑在这里实现,此处扮演Builder的角色。

/**
 * Created by wise on 2018/6/14.
 */

public class IPhoneBuilder implements IPhoneBuild {
    private IPhone mIPhone;

    public IPhoneBuilder() {
        mIPhone = new IPhone();
    }

    @Override
    public void buildScreen() {
        Log.d("build","Screen has been build");
        mIPhone.setScreen("OLED");
    }

    @Override
    public void buildMainBroad() {
        Log.d("build","MainBroad has been build");
        mIPhone.setMainBroad("Samsung");
    }

    @Override
    public void buildCPU() {
        Log.d("build","CPU has been build");
        mIPhone.setCPU("Snapdragon");
    }

    @Override
    public void buildCamera() {
        Log.d("build","Camera has been build");
        mIPhone.setCamera("Sony");
    }

    @Override
    public IPhone buildIPhone() {
        return mIPhone;
    }
}

4、IPhoneDirect(Director角色)

    IPhoneDirect为直接与用户交互的类,此处调用了各模块的建造方法,并且在这里控制模块建造与否、顺序逻辑,并最终组装成生成物返回给用户。

/**
 * Created by wise on 2018/6/14.
 */

public class IPhoneDirect {
    private IPhoneBuilder mIPhoneBuilder;

    public IPhoneDirect(IPhoneBuilder iPhoneBuilder){
        mIPhoneBuilder = iPhoneBuilder;
    }

    public IPhone build(){
        mIPhoneBuilder.buildCamera();
        mIPhoneBuilder.buildCPU();
        mIPhoneBuilder.buildMainBroad();
        mIPhoneBuilder.buildScreen();
        return mIPhoneBuilder.buildIPhone();
    }
}

5、实例调用

    此处演示在Activity中通过Direct对象完成一个IPhone对象的创建过程,在实际应用中上述的每一环节都要比此Demo中所写的要复杂很多,尤其是每个模块的建造过程和最终在Director中建造、组装的顺序是Build模式最独特和关键的特点。

public class BuildActivity extends AppCompatActivity {

    private IPhone myIPhone;
    private IPhoneDirect mIPhoneDirect;
    private TextView tv_ShowInfo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_build);
        tv_ShowInfo = (TextView) findViewById(R.id.tv_showInfo);
        mIPhoneDirect = new IPhoneDirect(new IPhoneBuilder());
        myIPhone = mIPhoneDirect.build();
        tv_ShowInfo.setText(myIPhone.getCamera() + "," + myIPhone.getCPU() + "," + myIPhone.getMainBroad() + "," + myIPhone.getScreen());
    }
}

参考

菜鸟教程:建造者模式

猜你喜欢

转载自blog.csdn.net/sdsxtianshi/article/details/80696759