六、通过KFC例子分析建造者模式

1 建造者模式?

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

分析:

  • 复杂对象:指的要具体生产的产品。
  • 复杂对象的构建:指的指挥者指挥具体的构建者去构建产品。
  • 复杂对象的表示:指的生产出来的产品长啥样。
  • 创建不同的表示:因为具体的创建者不同,所以创建出了不同的表示。

2 优缺点分析?

优点:

  1. 具体的建造者之间相互独立,这样更方便扩展。比如要增加一个新的产品,只需要增加一个新的构建者类就好了。
  2. 产品的创建过程(步骤,就是对应的具体构建者中的各个方法)清晰。

缺点:

  1. 如果产品的变化大(这个产品的部件时多时少),需要改进具体的创建类,代码改动大,不易维护。

3 demo(包含详细注释)

    package com.biao.builder.againchange;

    import java.util.ArrayList;
    import java.util.List;
    /*客户端入口函数*/
    public class BuilderDemo {
        public static void main(String[] args) {
            MealBuilder builderA  = new MealA();
            MealBuilder builderB  = new MealB();
            Director director = new Director();
            director.construct(builderA);
            Meal mealA = builderA.getMeal();
            mealA.show(1);

            director.construct(builderB);
            Meal mealB = builderB.getMeal();
            mealB.show(2);
        }
    }
    /*创建产品的抽象类,并且为所创建产品的各个部件抽象出接口(就是一个部件对应一个方法)*/
    /*一般情况,对于建造者模式,该抽象类至少包含创建部件的方法和返回对象两部分。*/
    abstract class MealBuilder{
        abstract void buildFood();
        abstract void buildDrink();
        abstract Meal getMeal();
    }
    /*产品的具体创建类,此部分相互独立,方便进行扩展,创建出各色各样的产品*/
    /*产品的具体创建类内部要维护一个产品,然后进行装配(给产品添加所需要的零件)*/
    class MealA extends MealBuilder{
        private Meal meal = new Meal();
        @Override
        void buildFood() {
            // TODO Auto-generated method stub
            meal.add("一盒薯条");
        }

        @Override
        void buildDrink() {
            // TODO Auto-generated method stub
            meal.add("一杯咖啡");
        }

        @Override
        Meal getMeal() {
            return meal;
        }

    }

    class MealB extends MealBuilder{
        private Meal meal = new Meal();
        @Override
        void buildFood() {
            // TODO Auto-generated method stub
            meal.add("一个汉堡");
        }

        @Override
        void buildDrink() {
            // TODO Auto-generated method stub
            meal.add("一杯牛奶");
        }

        @Override
        Meal getMeal() {
            return meal;
        }

    }
    /*实体类:通过具体的建造者去生产*/
    class Meal{
        List<String> parts = new ArrayList<String>();
        public void add(String part){
            parts.add(part);
        }

        /*产品展示方法*/
        public void show(int builder){
            System.out.println("通过建造者"+builder+"生产好的产品包括:");
            for (String part : parts) {
                System.out.println(part);
            }
        }
    }
    /*指挥者(kfc服务员),指挥如何去做这个套餐。该类和产品分离,只和产品的建造者打交道,解耦,单一职责*/
    class Director{
        public void construct(MealBuilder builder){
            builder.buildFood();
            builder.buildDrink();
        }
    }

本文参考:http://www.cnblogs.com/chenssy/p/3307787.html#commentform

时间: 2024-11-08 22:45:46

六、通过KFC例子分析建造者模式的相关文章

设计模式(十六):建造者模式

一.概述 建造者模式很容易让人想到建房子,不管建刚需房.改善房还是别墅,它们都离不开地基.柱子.层面和墙体这些组成部分,建筑工人就是把这些组成部分一个个建起来,最后连成一体建出一栋栋楼房. 来看看建造者模式的定义,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.建房子的过程都是相似的,但可以建出形形色色的房子. 二.结构类图 三.应用实例 我们用制造自行车为例子讲解建造者模式,自行车由车架.轮胎.脚踏等部件组成,如下图所示.自行车制造公司就是把这些零部件组装起来. 自行

C#设计模式-建造者模式

在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU.主板.硬盘.显卡.机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了.然而现实生活中也是如此的,如果公司要

设计模式学习04—建造者模式

一.动机与定义 创建对象时,我们知道可以使用工厂方式来创建,使调用者和具体实现解耦,但是有一种情况,当要创建的多个对象之间重复性较大,只有创建步骤.组装顺序或者内部构件不同时,工厂模式就需要进一步的演化了,如我们去KFC,有很多种套餐,比如套餐1(薯条+可乐+汉堡),套餐2(鸡肉卷+薯条+可乐),这个套餐就是我们要获取的复杂对象,那么程序如何创建出这种对象呢. 我们看到套餐的内容很多是一样的,那么我们是不是可以考虑将创建单个食品(如鸡肉卷.可乐等)方法提取出来,使用单独一个类协调这些食品的组合比

Java设计模式14:建造者模式

什么是建造者模式 发现很多框架的源码使用了建造者模式,看了一下觉得挺实用的,就写篇文章学习一下,顺便分享给大家. 建造者模式是什么呢?用一句话概括就是建造者模式的目的是为了分离对象的属性与创建过程,是的,只要记住并理解红字的几个部分,建造者模式你就懂了. 为什么需要建造者模式 建造者模式是构造方法的一种替代方案,为什么需要建造者模式,我们可以想,假设有一个对象里面有20个属性: 属性1 属性2 ... 属性20 对开发者来说这不是疯了,也就是说我要去使用这个对象,我得去了解每个属性的含义,然后在

设计模式(9)---建造者模式

一.定义 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 解释:使用建造者模式,用户只需要指定需要构造的类型就可以得到它们,而具体建造的过程和细节就不需要知道. 二.UML类图 三.基本代码 class Program { static void Main(string[] args) { Director director = new Director(); Builder builder1 = new ConcreteBuilder1(); direc

创建型模式(六)建造者模式

介绍这个设计模式之前,我先说两个知识点.Is-a.Has-a. Is-a 指一个类是另一个类的一种,是属于关系. Has-a 指表示一个角色的一项责任. 一句话的概要 创建一个复杂的对象,让其由各部分子对象通过一定的步骤而组合而成.这就是建造者模式. 剧情 小明跟女神交往过程中,总是感觉进展缓慢.于是小明就决定用一个烛光晚餐的惊喜,来打动女神. 但是,小明就一个人,他白天要约女神出来.所以他准备雇佣一个人来进行烛光晚餐的准备. 剧情看着很简单,但是我们来分析一下,怎么构造这种场景. 首先,必要的

从王者荣耀看设计模式(十六.建造者模式)

从王者荣耀看设计模式(建造者模式) 一.简介 为了玩王者荣耀的游戏体验感,不少玩家都会选择花钱购买自己常用英雄的皮肤.一方面,购买的皮肤通常要比原画更加"炫酷".另一方面,购买的英雄皮肤常常伴随有特殊的回城特效与攻击技能特效. 二.模式动机 不管在生活中还是软件系统中,都存在一个包含多个组成部件的复杂对象,如汽车,它包括车轮.方向盘.发动机等各种部件.组成复杂对象的这些部件之间或许还会一定的约束,若某些属性没有赋值可能无法构成完整产品使用.如,电子邮件包含地址.收件人姓名.联系方式.创

.NET设计模式 第二部分 创建型模式(3)—建造者模式(Builder Pattern)

建造者模式(Builder Pattern) ——.NET设计模式系列之四 Terrylee,2005年12月17日 概述 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定.如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式. 本文通过现实生活中的买

.NET设计模式(4):建造者模式(Builder Pattern)(转)

概述 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定.如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式. 本文通过现实生活中的买KFC的例子,用图解的方式来诠释建造者模式. 意图 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表