Builder模式

    xiaoxiao2021-12-14  18

    Builder模式介绍 Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精确地控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。

    Builder模式的使用场景 1.相同的方法,不同的执行顺序,产生不同的事件结果时。 2.多个部件或零件,都可以装配到一个对象中,但产生的运行结果又不相同时。 3.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适。 4.当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。

    Builder模式的简单实现 计算机的组装过程较为复杂,并且组装顺序是不固定的。简单的把计算机组装过程分为构建主机、设置操作系统、设置显示器三部分。然后通过Director和具体的Builder来构建计算机对象。

    package com.example.xll.builderpattern; /** * 功能:计算机抽象类,即Product角色 * 作者:xll * 日期:2016/12/2 * 邮箱:liangliang.xu1110@gmail.com */ public abstract class Computer { protected String mBoard; protected String mDisplay; protected String mOS; protected Computer() { } //设置主板 public void setBoard(String board) { mBoard = board; } //设置显示器 public void setDisplay(String display) { mDisplay = display; } //设置操作系统 public abstract void setOS(); @Override public String toString() { return "Computer{" + "mBoard='" + mBoard + '\'' + ", mDisplay='" + mDisplay + '\'' + ", mOS='" + mOS + '\'' + '}'; } } package com.example.xll.builderpattern; /** * 功能:抽象Builder类 * 作者:xll * 日期:2016/12/2 * 邮箱:liangliang.xu1110@gmail.com */ public abstract class Builder { //设置主机 public abstract void buildBoard(String board); //设置显示器 public abstract void buildDisplay(String display); //设置操作系统 public abstract void buildOS(); //创建Computer public abstract Computer create(); } package com.example.xll.builderpattern; /** * 功能:具体的Computer类,Macbook * 作者:xll * 日期:2016/12/2 * 邮箱:liangliang.xu1110@gmail.com */ public class Macbook extends Computer { protected Macbook(){ } @Override public void setOS() { mOS = "Mac OS X 10.10"; } } package com.example.xll.builderpattern; /** * 功能:具体的Builder类,MacbookBuilder * 作者:xll * 日期:2016/12/2 * 邮箱:liangliang.xu1110@gmail.com */ public class MacbookBuilder extends Builder { private Computer mComputer = new Macbook(); @Override public void buildBoard(String board) { mComputer.setBoard(board); } @Override public void buildDisplay(String display) { mComputer.setDisplay(display); } @Override public void buildOS() { mComputer.setOS(); } @Override public Computer create() { return mComputer; } } package com.example.xll.builderpattern; /** * 功能:Director类,负责构造Computer * 作者:xll * 日期:2016/12/2 * 邮箱:liangliang.xu1110@gmail.com */ public class Director { Builder mBuilder = null; /** * @param builder */ public Director(Builder builder){ mBuilder = builder; } /** * 构建对象 */ public void construct(String board,String display){ mBuilder.buildBoard(board); mBuilder.buildDisplay(display); mBuilder.buildOS(); } }

    最后运行:

    package com.example.xll.builderpattern; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //构建器 Builder builder = new MacbookBuilder(); //Director Director pcDirector = new Director(builder); //封装构建过程,4核、内存2GB、Mac系统 pcDirector.construct("英特尔主板","Retina显示器"); //构建计算机,输出相关信息 Log.i("Computer Info ",builder.create().toString()); } }

    打印日志如下:

    Computer Info : Computer{mBoard='英特尔主板', mDisplay='Retina显示器', mOS='Mac OS X 10.10'}

    上述示例中,通过具体的MacbookBuilder来构建Macbook对象,而Director封装了构建复杂产品对象的过程,对外隐藏构建细节。Builder和Director一起将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的对象。 值得注意的是,在现实开发过程中,Director角色经常会被省略。而直接使用一个Builder来进行对象的组装,这个Builder通常为链式调用,它的关键点是每个setter方法都返回自身,也就是return this,这样就使得setter方法可以链式调用,代码大致如下:

    new TestBuilder().setA("A") .setB("B") … .create();

    通过这种形式不进去除了Director角色,整个结构也更加简单,也能对Product对象的组装过程有更精细的控制。

    总结 Builder模式在Android开发中较为常用,如:AlertDialog等。比较常见的实现形式是通过调用链实现,这样使得代码更简洁、易懂。 优点 1.良好的封装性,使用建造者模式可以是客户端不必知道产品的内部组成的细节。 2.建造者独立,容易扩展 缺点 会产生多余的Builder对象以及Director对象,消耗内存。

    转载请注明原文地址: https://ju.6miu.com/read-963908.html

    最新回复(0)