zoukankan      html  css  js  c++  java
  • 建造者模式

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

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

    • 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());
        }
    }

     

  • 相关阅读:
    VS2010下配置CxImage
    Visual Studio 2010 开发配置
    主机屋使用感受
    Web开发者必备的20款超赞jQuery插件
    自动页面居中
    jQuery+CSS打造的网页背景颜色切换效果
    小按钮,大学问
    【网站开发必备】——12款响应式 Lightbox(灯箱)效果插件
    修正 IE 的双倍页边距 bug
    a>b?a:b
  • 原文地址:https://www.cnblogs.com/loveBolin/p/9683798.html
Copyright © 2011-2022 走看看