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

    一、定义

     是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    创建者模式中的四个角色:

    • Product产品类:由一系列部件组成,要创建的复杂对象。
    • Builder抽象建造者:给出一个抽象接口,规范产品的组建。
    • ConcreteBuilder具体创建者:实现Builder接口,组建产品并且返回组建好的产品。
    • Director导演类:调用具体建造者来创建复杂对象的各个部分,在导演类中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

    二、类型

     创建型

    三、适用场景

    • 产品具有复杂的内部结构。
    • 产品对象通常包含多个成员属性,需要生成的产品对象的属性相互依赖,需要指定其生成顺序。

    四、优点

    • 客户端不必知道产品内部的组成细节。
    • 可以更加精细地控制产品的创建过程
    • 建造者独立容易扩展,增加新的具体建造者无须修改原有类库的代码。

    五、缺点

    • 产品之间差异性很大的情况: 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
    • 产品内部变化很复杂的情况: 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

    六、类图

     

    七、代码实现

     产品类(可定义为抽象产品类):

    package com.wms.createtype.builder;
    
    public class GameRole {
        private String skinColor;
        private String height;
        private String weight;
    
        public String getSkinColor() {
            return skinColor;
        }
    
        public void setSkinColor(String skinColor) {
            this.skinColor = skinColor;
        }
    
        public String getHeight() {
            return height;
        }
    
        public void setHeight(String height) {
            this.height = height;
        }
    
        public String getWeight() {
            return weight;
        }
    
        public void setWeight(String weight) {
            this.weight = weight;
        }
    }

     建造者抽象类:

    package com.wms.createtype.builder;
    
    public abstract class Builder {
        public abstract void bulidSkinColor();
        public abstract void bulidHeight();
        public abstract void bulidWeight();
        public abstract GameRole buildGameRole();
    }

     建造者实现类:

    package com.wms.createtype.builder;
    
    public class ChinaBuilder extends Builder {
    
        private GameRole gameRole;
    
        public ChinaBuilder() {
            gameRole = new GameRole();
        }
    
        public void bulidSkinColor() {
            gameRole.setSkinColor("黄色皮肤");
        }
    
        public void bulidHeight() {
            gameRole.setHeight("身高175cm");
        }
    
        public void bulidWeight() {
            gameRole.setWeight("体重75kg");
        }
    
        public GameRole buildGameRole() {
            return gameRole;
        }
    }
    package com.wms.createtype.builder;
    
    public class EnglandBuilder extends Builder {
    
        private GameRole gameRole;
    
        public EnglandBuilder() {
            gameRole = new GameRole();
        }
    
        public void bulidSkinColor() {
            gameRole.setSkinColor("白色皮肤");
        }
    
        public void bulidHeight() {
            gameRole.setHeight("身高185cm");
        }
    
        public void bulidWeight() {
            gameRole.setWeight("体重85kg");
        }
    
        public GameRole buildGameRole() {
            return gameRole;
        }
    }

    导演类:

    package com.wms.createtype.builder;
    
    public class Director {
        private Builder builder;
    
        public Director(Builder builder) {
            this.builder = builder;
        }
    
        public GameRole getGameRole() {
            builder.bulidSkinColor();
            builder.bulidHeight();
            builder.bulidWeight();
            return builder.buildGameRole();
        }
    }

    客户端:

    package com.wms.createtype.builder;
    
    public class TestDesignPattern {
        public static void main(String[] args) {
            Builder chinaBuilder = new ChinaBuilder();
            Director chinaDirector = new Director(chinaBuilder);
            GameRole chinaGameRole = chinaDirector.getGameRole();
            System.out.println("skinColor:" + chinaGameRole.getSkinColor() + ", height=:" + chinaGameRole.getHeight()
                    + ", weight='" + chinaGameRole.getWeight());
    
            Builder englandBuilder = new EnglandBuilder();
            Director englandBuider = new Director(englandBuilder);
            GameRole englandGameRole = englandBuider.getGameRole();
            System.out.println("skinColor:" + englandGameRole.getSkinColor() + ", height=:" + englandGameRole.getHeight()
                    + ", weight='" + englandGameRole.getWeight());
        }
    }
  • 相关阅读:
    (转)LayoutInflater的使用
    SQLite入门
    字符排序 分类: java 20100103 14:28 791人阅读 评论(1) 收藏
    oracle常用日期函数 20091211 22:13 300人阅读 评论(0) 收藏
    several years later 分类: 人生墨客 20100106 12:29 470人阅读 评论(0) 收藏
    值传递与引用传递 分类: java 20091218 21:41 343人阅读 评论(0) 收藏
    第一章 基本知识 分类: java 20091229 16:49 307人阅读 评论(0) 收藏
    第三章 运算符、表达式与语句 分类: java 20091229 16:46 304人阅读 评论(0) 收藏
    第五章 继承、接口与泛型 分类: java 20091229 16:43 348人阅读 评论(0) 收藏
    第二章 基本数据类型,输入、输出,数组 分类: java 20091229 16:48 339人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/wangmingshun/p/10197902.html
Copyright © 2011-2022 走看看