设计模式之创建者模式

这篇具有很好参考价值的文章主要介绍了设计模式之创建者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍

建造者模式(Builder Pattern)属于创建型设计模式,很多博客文章的对它的作用解释为用于将复杂对象的创建过程与其细节表示分离。但对于初学者来说,这句话难免有点晦涩难懂,何为复杂对象?何为创建过程,何为细节表示?

复杂对象:一个对象中的成员属性出了基本数据类型及其对应的封装类型,还包含有其他类型对象。例如:在对象A中包含对象B的引用,对象B中又包含对象C的引用。

创建过程:一个对象的实例化和初始化过程。如new一个对象后再调用其set方法为其初始化。

细节表示:在对一个对象初始化时,通过set方法表示其创建的细节。说白了,细节表示就是该对象的成员变量。

在一般情况下,我们要创建一个完整的对象时,往往是通过两个步骤完成:①实例化(即new一个对象);②初始化(即调用set方法对其属性赋值)。这是一种创建过程与细节表示耦合的情况。即:一个对象的实例化和初始化过程就表示为其创建过程;而在初始化过程中通过set方法我们又了解到了其内部属性(即细节表示)

而在建造者模式中,我们只需要通过一个对象的建造者(Builder)所提供的方法向其描述对象的细节,该然后该建造者通过其核心方法build()将对象实例化并补充其细节。这就是建造者的核心思想。

二、应用

  • java中的StringBuilder类。我们通过其提供的各种重载的append()方法,描述一个字符串的细节,最后通过toString()方法获得String实例。
  • OkHttp中应用了大量的建造者模式。如创建请求客户端时,使用OkHttpClient的内部类Builder来描述请求的细节,然后通过build()方法获得一个OkHttpClient实例。

三、案例

1. 麦当劳1+1随心配

我们以麦当劳随心配1+1套餐为例,当用户选择该套餐时,该套餐规定选择一个任意主食 + 一个任意冷饮。如下图所示

  • 选择主食

    设计模式之创建者模式,JAVA,设计模式,设计模式,java

  • 选择冷饮

    设计模式之创建者模式,JAVA,设计模式,设计模式,java

添加到购物车后,我们可以看到该套餐详情

设计模式之创建者模式,JAVA,设计模式,设计模式,java

2. 代码演示

  • 新建套餐抽象接口Meal,以及实现该接口的随心配1+1套餐SuiXinPeiMeal

    public interface Meal {
    	// 套餐价格
        Float getCost();
    
        // 套餐详情
        void order();
    }
    
    
    public class SuiXinPeiMeal implements Meal{
    
        // 主食
        private Food food;
    
        // 冷饮
        private ColdDrink coldDrink;
        
        // 省略get、set方法...
    
        // 套餐价格
        @Override
        public Float getCost() {
            return 5F;
        }
    
        // 套餐详情
        @Override
        public void order() {
            System.out.println("随心配1+1套餐:");
            System.out.println("主食:" + food.getName() + ",单价:" + food.getCost());
            System.out.println("冷饮:" + coldDrink.getName() + ",单价:" + coldDrink.getCost());
            System.out.println("套餐价格:" + getCost());
        }
    }
    
  • 新建一个随心配1+1套餐的创建者SuiXinPeiMealBuilder

    public class SuiXinPeiMealBuilder {
    
        private Food food;
        private ColdDrink coldDrink;
    	// 向套餐中添加主食
        public void addFood(Food food) {
            this.food = food;
        }
    	// 向套餐中添加冷饮
        public void addColdDrink(ColdDrink coldDrink) {
            this.coldDrink = coldDrink;
        }
    
        // 创建套餐
        public Meal build() {
            if (food == null) {
                throw new RuntimeException("请选择一个主食");
            }
            if (coldDrink == null) {
                throw new RuntimeException("请选择一个冷饮");
            }
    
            SuiXinPeiMeal meal = new SuiXinPeiMeal();
            meal.setFood(food);
            meal.setColdDrink(coldDrink);
            return meal;
        }
    }
    
  • 新建单品抽象接口SingleProduct

    public interface SingleProduct {
    	// 单品名称
        String getName();
    	// 单品价格
        Float getCost();
    }
    
  • 新建主食抽象接口Food、及其实现类Chicken鸡块、Fries薯条、Hamburger汉堡

    public interface Food extends SingleProduct {
    }
    
    public class Chicken implements Food{
        @Override
        public String getName() {
            return "鸡块";
        }
    
        @Override
        public Float getCost() {
            return 13F;
        }
    }
    
    public class Fries implements Food{
        @Override
        public String getName() {
            return "薯条";
        }
    
        @Override
        public Float getCost() {
            return 10F;
        }
    }
    
    public class Hamburger implements Food {
    
        @Override
        public String getName() {
            return "汉堡";
        }
    
        @Override
        public Float getCost() {
            return 15F;
        }
    }
    
  • 新建冷饮抽象接口ColdDrink、及其实现类CocaCola可乐、NoSugarCola无糖可乐、Sprite雪碧

    public interface ColdDrink extends SingleProduct {
    }
    
    public class CocaCola implements ColdDrink{
        @Override
        public String getName() {
            return "可乐";
        }
    
        @Override
        public Float getCost() {
            return 3.8F;
        }
    }
    
    public class NoSugarCola implements ColdDrink {
        @Override
        public String getName() {
            return "无糖可乐";
        }
    
        @Override
        public Float getCost() {
            return 5.0F;
        }
    }
    
    public class Sprite implements ColdDrink {
        @Override
        public String getName() {
            return "雪碧";
        }
    
        @Override
        public Float getCost() {
            return 8F;
        }
    }
    
  • main()方法中进行套餐模拟

    public static void main(String[] args) {
        // 套餐:鸡块+可乐
        SuiXinPeiMealBuilder builder1 = new SuiXinPeiMealBuilder();
        // 选择鸡块
        builder1.addFood(new Chicken());
        // 选择可口可乐
        builder1.addColdDrink(new CocaCola());
        // 创建订单
        Meal meal1 = builder1.build();
        // 输出订单详情
        meal1.order();
    
        System.out.println("==============================================");
    
    	// 套餐:汉堡+雪碧
        SuiXinPeiMealBuilder builder2 = new SuiXinPeiMealBuilder();
        builder2.addFood(new Hamburger());
        builder2.addColdDrink(new Sprite());
        Meal meal2 = builder2.build();
        meal2.order();
    }
    

3. 演示结果

运行上述代码,结果如下

设计模式之创建者模式,JAVA,设计模式,设计模式,java

四、优缺点

  • 优点
    • 对象的创建过程与其细节表示分离,即解耦。
  • 缺点:
    • 产生多余的建造者Builder类,且每当添加一种套餐,就需要多写一个对应的套餐建造者类。
    • 建造者与对象之间耦合,当修改对象结构时,建造者也要修改。
    • 可读性相对较差。

五、送给读者

  • 在非必要的情况下,业务代码中不建议使用该设计模式,没有性能上的优化却导致可读性变差,属于炫技型设计模式。
  • 如果本文对你有所帮助,别忘了安排博主一顿麦当劳随心配1+1套餐哦。


纸上得来终觉浅,绝知此事要躬行。

————————我是万万岁,我们下期再见————————文章来源地址https://www.toymoban.com/news/detail-663247.html

到了这里,关于设计模式之创建者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式】builder 创建者设计模式详解(包含电商应用场景及代码示例)

    在常见的设计模式中,“Builder” 通常是指一种设计模式,而不是具体的类或方法。Builder 模式是一种创建型设计模式,其目的是通过提供一个独立的构建器类来构建一个复杂对象。 建造者模式 (Builder Pattern) 是一种创建型设计模式,它的主要目标是为了将一个复杂对象的构

    2024年01月21日
    浏览(39)
  • 【创建者模式】工厂模式

    根据百科的定义,工厂模式是“工厂是用于创建其他对象的对象”。 以咖啡店为例,设计一个咖啡类Coffee,并定义其两个子类(美式咖啡AmericanCoffee和拿铁咖啡LatteCoffee);再设计一个咖啡店类CoffeeStore,咖啡店具有点咖啡的功能。 在上面的示例中,我们没有使用任何模式并

    2023年04月11日
    浏览(62)
  • 【新手上路】如何在Web3时代成为XR创建者

    目录 0 XR在Web3里的作用 1 XR的概念、特征、技术、设备、平台、应用和工具 1.1 VR的概念、特征和技术 1.2 AR的概念、特征和技术 1.2 XR的设备、平台、应用和工具 2 选择XR的方法 2.1 何时使用VR 2.2 何时使用AR 3 开发XR作品的4个步骤 4 成为XR构建者的路径 4.1 三种开发XR作品的方式

    2024年02月10日
    浏览(31)
  • 【Java 设计模式】创建型之工厂方法模式

    在软件开发中,工厂方法模式是一种常见的创建型设计模式, 它提供了一种将对象的实例化延迟到子类的方法 。工厂方法模式通过定义一个创建对象的接口,但是让子类决定实例化哪个类。在本文中,我们将介绍 Java 设计模式中的工厂方法模式,了解其定义、使用场景以及

    2024年01月17日
    浏览(51)
  • 【Java 设计模式】创建型之抽象工厂模式

    在软件开发中,抽象工厂模式是一种常见的创建型设计模式, 它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 。抽象工厂模式的核心思想是将一组相关的产品组合成一个工厂,客户端通过工厂接口创建一系列产品。在本文中,我们将介绍 Jav

    2024年01月17日
    浏览(44)
  • 【Java 设计模式】创建型之建造者模式

    在软件开发中,建造者模式是一种创建型设计模式, 它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示 。建造者模式通常包括一个指导者(Director)类和多个建造者(Builder)类,指导者负责组织建造者的构建过程,而建造者负责具体的构建步

    2024年01月21日
    浏览(48)
  • 【Java 设计模式】创建型之单例模式

    在软件开发中,单例模式是一种常见的设计模式, 它确保一个类只有一个实例,并提供一个全局访问点 。单例模式在需要控制某些资源,如数据库连接池、线程池等共享资源的情况下非常有用。在本文中,我们将介绍 Java 设计模式中的单例模式,了解其实现方式、使用场景

    2024年01月18日
    浏览(46)
  • Java23种设计模式-创建型模式之单例模式

    单例模式 (Singleton Pattern):通过单例模式的方法创建的 类在当前进程中只有一个实例 (根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例),该类负责 创建自己的对象 ,同时 确保只有单个对象 被创建。 注 : 1、单例类 只能 有 一个实例 。

    2024年04月26日
    浏览(43)
  • [设计模式Java实现附plantuml源码~创建型] 产品族的创建——抽象工厂模式

    前言: 为什么之前写过Golang 版的设计模式,还在重新写 Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很多人学习有做笔记的习惯,如果单纯的只是放一张图片,那

    2024年01月22日
    浏览(44)
  • Java设计模式之创建型-原型模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析  4.1、通用实现(浅克隆) 4.2、深克隆 五、总结 原型模式通过复制已有对象作为原型,通过复制该原型来返回一个新对象,而不是新建对象,说白了就是不断复制相同的对象罢了。 角色 描述 抽象原型类 规定了具

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包