博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
建造者模式
阅读量:5368 次
发布时间:2019-06-15

本文共 2922 字,大约阅读时间需要 9 分钟。

也叫做生成器模式,其定义如下:讲一个复杂的对象构建与他的表示分离,使得同样的创建过程可以创建不同的表示。

在建造者模式中,有四个角色:

  • Product产品模型类

 通常是实现了模板方法,也就是有模板方法和基本方法。

  • Builder抽象建造类

产品的组建,一般由子类实现。

  • ConcreateBuilder具体建造者

实现抽象类的具体方法,并且返回一个组建好的对象。

  • Director导演类

设计产品的构建方式,告知builder开始构建。

以下是一段通用代码示例:

 

//产品类public class Product{    public void doSomething(){    }}//抽象建造类public abstract class Builder{    //设置产品的不同部分,以获得不同的产品    public abstract void setPart();    //建造产品    public abstract Product buildProduct();}//具体建造者public class ConcreateProduct extends Builder{    private Product product = new Product();    //设置产品零件    public void setPart(){        /**产品类的逻辑处理*/    }    //组建一个产品    public Product buildProduct(){        return product;    }}//导演类,可以起到封装作用,防止高层模块侵入到建造者内部的实现类中public class Director{    private Builder builder = new ConcreateProduct();    //构建不同的产品    public Product getAProduct(){        builder.setPart();        return builder.buildProduct();    }}

建造者模式优点:

  • 封装性,使客户端不必知道产品内部组成的细节。
  • 建造者独立,容易扩展。如果有多个ConcreateProduct是相互独立的,对系统扩展非常有利。
  • 便于控制细节风险,由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他模块产生影响。

使用场景:

  • 相同的执行方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,可以使用该模式
  • 产品类非常复杂,或者产品类中的调用顺序产生不同的效能,适合使用该模式

扩展之链式编程:

建造者模式与工厂模式区别在于使用不同的顺序构造不同的对象,下面举一个例子(转载自博文https://blog.csdn.net/minwenping/article/details/78725911?utm_source=copy

),假设有四个角色:

1.用户client,提出造房子 Room的需求

2.设计者,Designer,出图纸,指挥包工头干,持有包工头

3.包工头, interface Build,拥有步骤和返回房子Room

4.Room,最终的产品

代码如下:

public class Room {    //产品类,room,返回给client    private String window;    private String floor;    /**     * 真正的构建过程     * @param roomParams     * @return     */    public Room freshRoom(RoomParams roomParams) {        this.window=roomParams.window;        this.floor=roomParams.floor;        return this;    }    @Override    public String toString() {        return "Room [window=" + window + ", floor=" + floor + "]";    }}
public class WorkerBuilder {    //具体建造者 工人worker持有房子引用    Room room=new Room();    RoomParams roomParams=new RoomParams();    public WorkerBuilder makeWindow(String windowStyle) {        roomParams.setWindow(windowStyle);        return this;    }    public WorkerBuilder makeFloor(String floorStyle) {        roomParams.setFloor(floorStyle);        return this;    }    public Room build() {        // TODO Auto-generated method stub        return room.freshRoom(roomParams);    }    class RoomParams{        public String window;        public void  setWindow(String window) {            this.window = window;        }        public void setFloor(String floor) {            this.floor = floor;        }        public String floor;    }}
public class Client {    //client 客户提出需求,造房子,并得到房子    //不关心过程和建造逻辑    public static void main(String[] args) {        //1.提供具体建造者,链式编程        Room room=new WorkerBuilder().makeFloor("光滑地板").makeWindow("透明窗口").build();        //4.建造完成,验收        System.out.println("room建造完成:"+room.toString());    }}

 

 

转载于:https://www.cnblogs.com/loveBolin/p/9683798.html

你可能感兴趣的文章
nginx 安装和配置文件说明
查看>>
python数据类型详解
查看>>
Java多线程框架Executor详解
查看>>
[转]如何学习C#,学习C#的步骤.很详细.
查看>>
尚福林:三家民营银行获准筹建
查看>>
银监会拟允许银行理财产品直接投资
查看>>
编写自己的who命令
查看>>
cocos2d-x介绍
查看>>
Python-初始面向对象
查看>>
评价输入法
查看>>
[codevs1157]2^k进制数
查看>>
判断两个对象是否相同
查看>>
java数组
查看>>
学习进度条---第十周
查看>>
11. Container With Most Water && 42. Trapping Rain Water
查看>>
2019年春节期间所看电影的短评
查看>>
WP7 Bing Map 显示中文地图
查看>>
【Python】使用codecs模块进行文件操作及消除文件中的BOM
查看>>
Excel 2007 批量删除隐藏的文本框
查看>>
ASP.NET Zero--3.菜单配置
查看>>