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

    建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节.

    建造者模式(Builder Pattern) 又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

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

    抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可;

    而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品

    建造者模式的UML结构图

    Product(产品角色): 一个具体的产品对象。

    Builder(抽象建造者): 创建一个Product对象的各个部件指定的抽象接口。

    ConcreteBuilder(具体建造者): 实现抽象接口,构建和装配各个部件。

    Director(指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程

    KFC套餐例子

    /**
     * 产品角色
     * 一种套餐:有食品名称和饮料两种属性
     */
    @Data
    public class Meal {
    
        private String food;
        private String drink;
    }
    /**
     * 抽象建造者
     * 组合了产品(套餐)
     * 制造食品和饮料
     * get产品
     */
    @Getter
    public abstract class MealBuilder {
        Meal meal = new Meal();
    
        public abstract void buildFood();
    
        public abstract void buildDrink();
    }
    /**
     * 套餐A
     */
    public class MealA extends MealBuilder {
    
        @Override
        public void buildFood() {
            meal.setFood("薯条");
        }
    
        @Override
        public void buildDrink() {
            meal.setDrink("甜茶");
        }
    }
    /**
     * 套餐B
     */
    public class MealB extends MealBuilder {
        @Override
        public void buildFood() {
            meal.setFood("鸡腿");
        }
    
        @Override
        public void buildDrink() {
            meal.setDrink("泸州老窖百调星座预调酒");
        }
    }
    /**
     * 指挥官
     * 作用是利用建造者将各个部分(属性)的建造走一条流水线
     * 这里是套餐的两个属性食品和饮料
     * 如果没有指挥官(核心方法Constructor)方法,客户端构建一个Meal对象时就需要自己明白构建过程(buildFood,buildDrink...)
     */
    @AllArgsConstructor
    public class Director {
        private MealBuilder mealBuilder;
    
        /**
         * 制造一种套餐
         * @return
         */
        public Meal constructor(){
            mealBuilder.buildFood();
            mealBuilder.buildDrink();
    
            return mealBuilder.getMeal();
        }
    }
    /**
     * 建造者模式测试
     */
    public class MainTest {
    
        @Test
        public void testBulider(){
            //B套餐建造者
            MealB mealB = new MealB();
    
            //指挥官得到的菜单是套餐B
            Director director = new Director(mealB);
    
            //指挥官利用建造者流水线创造一个产品套餐
            Meal meal = director.constructor();
    
            System.out.println(meal.toString());
        }
    }

    建造者模式的一个变种

    lombok的@Builderhttps://www.cnblogs.com/theRhyme/p/10181103.html

     

    参考:

    https://www.cnblogs.com/snailclimb/p/builderpattern.html

  • 相关阅读:
    sublime 标题乱码,内容正常
    解决PHP7+ngnix+yaf框架404的问题
    调用RPC接口出现错误:Yar_Client_Transport_Exception (16) curl exec failed 'Timeout was reached'
    xhprof安装和使用
    单点登录
    如何让局域网内Apache互相访问
    lnmp
    virtualbox
    微信省市区 Mysql数据库
    lnmp
  • 原文地址:https://www.cnblogs.com/theRhyme/p/10401562.html
Copyright © 2011-2022 走看看