美文网首页
建造者模式

建造者模式

作者: 笨笨翔 | 来源:发表于2018-09-18 17:41 被阅读0次

    1. 模式定义

    建造者模式(Builder Pattern): 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创见性模式。又称生成器模式

    2. 模式结构

    建造者模式包含如下角色:

    • Builder:抽象建造者
    • ConcreateBuilder:具体建造者
    • Product:产品角色
    • Director:导演者/指挥者角色


      image

    3. 时序图

    image

    4. 代码分析

    /**
     * 套餐类
     */
    public class Meal {
        private String food;
        private String drink;
    
        public String getFood() {
            return food;
        }
    
        public void setFood(String food) {
            this.food = food;
        }
    
        public String getDrink() {
            return drink;
        }
    
        public void setDrink(String drink) {
            this.drink = drink;
        }
    
        public void show(){
            System.out.println("Food: " + food + "\t" + "Drink: " + drink);
        }
    }
    
    /**
     * 套餐建造者
     */
    public abstract class MealBuilder {
        protected Meal meal = new Meal();
    
        protected abstract void buildFood();
    
        protected abstract void buildDrink();
    
        public Meal getMeal(){
            return meal;
        }
    }
    
    /**
     * A套餐
     */
    public class SubMealBuildA extends MealBuilder {
        @Override
        protected void buildFood() {
            meal.setFood("炸鸡汉堡");
        }
    
        @Override
        protected void buildDrink() {
            meal.setDrink("可口可乐");
        }
    }
    
    /**
     * B套餐
     */
    public class SubMealBuildB extends MealBuilder{
    
        @Override
        protected void buildFood() {
            meal.setFood("牛肉汉堡");
        }
    
        @Override
        protected void buildDrink() {
            meal.setDrink("橙汁");
        }
    
    }
    
    /**
     * 导演者角色/指挥者角色
     */
    public class Director {
        private MealBuilder builder;
    
        Director(MealBuilder builder){
            this.builder = builder;
        }
    
        public void setBuilder(MealBuilder builder) {
            this.builder = builder;
        }
    
        public void constuct(){
            builder.buildDrink();
            builder.buildFood();
        }
    }
    
    /**
     * 客户端代码
     */
    public class MainClass {
        public static void main(String[] args) {
    
            MealBuilder builderA = new SubMealBuildA();
            MealBuilder builderB = new SubMealBuildB();
            Director director = new Director(builderA);
    
            director.constuct();
            builderA.getMeal().show();
    
            director.setBuilder(builderB);
            director.constuct();
            builderB.getMeal().show();
    
        }
    }
    

    运行结果:


    image.png

    5. 优点

    • 建造者模式中,客户不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
    • 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便的替换具体建造者或新增新的具体建造者,用户使用不同的具体建造者及可得到不同的产品对象。
    • 可以更加精细的控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更加方便使用程序来控制创建过程。
    • 增加新的具体建造者无须修改原油类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。

    6. 缺点

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

    7. 模式应用

    在很多游戏软件中,地图包括天空、地面、背景等组成部分,任务角色包括人体、服装、装备等组成部分,可以使用建造者模式对其进行设计,通过不同的具体建造者创建不同类型的地图或任务。

    参考:图说设计模式

    相关文章

      网友评论

          本文标题:建造者模式

          本文链接:https://www.haomeiwen.com/subject/emapnftx.html