设计模式之工厂方法模式笔记

设计模式之工厂方法模式笔记

  • 说明
  • Factory Method(工厂方法)
  • 目录
  • UML抽象工厂示例类图
  • 咖啡抽象类
    • 美式咖啡类
    • 拿铁咖啡类
  • 咖啡工厂接口
    • 美式咖啡工厂类
    • 拿铁咖啡工厂类
  • 咖啡店类
  • 测试类

说明

记录下学习设计模式-工厂方法模式的写法。

Factory Method(工厂方法)

意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
结构:
在这里插入图片描述
其中:

  • Product定义工厂方法所创建的对象的接口。
  • ConcreteProduct实现Product接口。
  • Creator声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的默认实现,它返回一个默认的ConcreteProduct对象,可以调用工厂方法以创建一个Product对象。
  • ConcreteCreator重定义工厂方法以返回一个ConcreteProduct实例。

适用性:

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

目录

在这里插入图片描述

UML抽象工厂示例类图

在这里插入图片描述

以该UML类图实现工厂方法示例。

咖啡抽象类

package com.example.deesign_patterns.factory_method;

public abstract class Coffee {

    public abstract String getName();

    //加糖
    public void addSugar(){
        System.out.println("加糖");
    }

    //加奶
    public void addMilk(){
        System.out.println("加奶");
    }

}

美式咖啡类

package com.example.deesign_patterns.factory_method;

//美式咖啡类
public class AmericanCoffer extends Coffee {

    @Override
    public String getName() {
        return "美式咖啡";
    }
}

拿铁咖啡类

package com.example.deesign_patterns.factory_method;

//拿铁咖啡类
public class LatteCoffee extends Coffee {

    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}

咖啡工厂接口

package com.example.deesign_patterns.factory_method;

//咖啡工厂类
public interface CoffeeFactory {

    //创建咖啡对象的方法
    Coffee createCoffee();
}

美式咖啡工厂类

package com.example.deesign_patterns.factory_method;

//美式咖啡工厂对象,专门用来生产美式咖啡
public class AmericanCofferFactory implements CoffeeFactory {

    @Override
    public Coffee createCoffee() {
        return new AmericanCoffer();
    }
}

拿铁咖啡工厂类

package com.example.deesign_patterns.factory_method;

//拿铁咖啡工厂对象,专门用来生产拿铁咖啡
public class LatteCoffeeFactory implements CoffeeFactory {

    @Override
    public Coffee createCoffee() {
        return new LatteCoffee();
    }
}

咖啡店类

package com.example.deesign_patterns.factory_method;

//咖啡店类
public class CoffeeStore {

    private CoffeeFactory factory;

    public void setFactory(CoffeeFactory factory){
        this.factory=factory;
    }

    //点咖啡功能
    public Coffee orderCoffee(){
        Coffee coffee = factory.createCoffee();
        //添加配料
        coffee.addSugar();
        coffee.addMilk();
        return coffee;
    }
}

测试类

package com.example.deesign_patterns.factory_method;

//测试类
public class Client {

    public static void main(String[] args) {
        //创建咖啡店对象
        CoffeeStore store = new CoffeeStore();
        //创建对象
        CoffeeFactory factory=new AmericanCofferFactory();
        //CoffeeFactory factory=new LatteCoffeeFactory();
        store.setFactory(factory);
        //点咖啡
        Coffee coffee=store.orderCoffee();
        System.out.println(coffee.getName());
    }
}

在这里插入图片描述

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则。

缺点
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29966.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

主从架构lua脚本-Redis(四)

上篇文章介绍了rdb、aof持久化。 持久化RDB/AOF-Redis(三)https://blog.csdn.net/ke1ying/article/details/131148269 redis数据备份策略 写job每小时copy一份到其他目录。目录里可以保留最近一个月数据。把目录日志保存到其他服务器,防止机…

专业的知识图谱应用门槛正在被不断降低

前⾔ 知识图谱(knowledge graph)⼀度被专家称为“AI皇冠上的明珠”,因为知识图谱技术是⼈⼯智能技术⽅向中的重要⼀环。它不仅可以为其他⼈⼯智能应⽤提供⽀持,如⾃然语⾔处理、推荐系统等,更可以帮助⼈⼯智能系统⾃主…

《微服务实战》 第三十一章 ShardingSphere - ShardingSphere-JDBC

前言 Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。 Apache ShardingSphere 设计哲学为 Database Plus,旨在构建异构数据库上层的…

【Python 随练】统计字符类型个数

题目: 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 简介: 在本篇博客中,我们将解决一个字符统计问题:输入一行字符,统计其中英文字母、空格、数字和其他字符的个数。我们将提供…

NoSQLBooster 8.0.11 for MongoDB

MongoDB最智能的IDE。 NoSQLBooster 是适用于 MongoDB Server 3.6-6.0 的跨平台 GUI 工具,它提供了内置的 MongoDB 脚本调试器、全面的服务器监控工具、链接流畅查询、SQL 查询、查询代码生成器、任务调度、ES2020 支持和高级 IntelliSense 体验。 嵌入式MongoDB S…

强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验

【强化学习原理项目专栏】必看系列:单智能体、多智能体算法原理项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍:【强化学习原理项目专栏】必看系列:单智能体、多智能体算法原理项目实战、相关技巧…

redis键值对映射关系存储-Dict

基本概述 Redis是一个键值型(Key-Value Pair)的数据库,可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成,分别是:哈希表(DictHashTable)、哈希节点&a…

redis安装

在官网下载: https://redis.io/download/ 或者直接下载: ​wget https://download.redis.io/releases/redis-6.2.12.tar.gz 解压到/usr/local/下 [rootlocalhost ~]# tar redis-6.2.12.tar.gz -C /usr/local/ [rootlocalhost ~]# cd /usr/local/redis-6.2.12 [rootlocalho…

C++算法————二分查找

又是鸽了三千万年 马上要打csp了,开始回流学j组的知识了,浅说一下二分吧() --------------------------------------------------------------------------------------------------------------------------------- 二分查找 …

了解MVC、MVP、MVVM模式

前言 在Android开发中,当你梳理完需求后,你要做的并不是马上写下你的第一行代码,而是需先设计好整个项目的技术框架今天,我将全面介绍Android开发中主流的技术框架MVC、MVP 与 MVVM模式,并实例讲解MVP模式&#xff0c…

面试篇:SpringCloud

一、SpringCloud常见的组件有什么? 1、常见微服务功能架构图 2、阿里巴巴SpringCloud常用组件 注册中心/配置中心:Nacos负载均衡:Ribbon服务调用:Feign服务保护:Sentinel服务网关:Gateway 二、服务注册…

Compose Desktop 实战 宝可梦图鉴

Compose Desktop 实战 宝可梦图鉴 前言 阅读本文需要一定compose基础,如果没有请移步Jetpack Compose入门详解(实时更新) 接口数据来源于pokeapi 项目源代码 如果你觉得不错,请给我一个star,THKS 实现效果 闲话不…

php通过cURL爬取数据(3):CURLINFO_HTTP_CODE返回0的排查和解决方案

CURLINFO_HTTP_CODE返回0的排查和解决方案 一、curl本地服务器需要DNS解析域名二、如何排查错误原因三、无法解析 DNS的程序升级方案四、宝塔配置DNS的操作方法1.etc/resolv.conf2.通过GUI界面 一、curl本地服务器需要DNS解析域名 在使用 curl 命令发送请求到域名地址&#xf…

测试(二)

1.软件测试的生命周期 需求分析→测试计划→ 测试设计→ 测试开发→ 测试执行→ 测试评估 2.如何描述一个Bug 3.Bug的优先级 1、Blocker(崩溃): 阻碍开发或测试工作的问题;造成系统崩溃、死机、死循环,导致数据库数…

Unity基础 视频组件VideoPlayer,视频的播放与控制

在Unity中,视频播放功能具有广泛的应用,以下是一些视频播放在Unity中的常见用途: 游戏引入和过场动画:使用视频播放可以在游戏开始或过场动画中添加引人注目的视频,为游戏制造氛围和引起玩家的兴趣。这种方式可以通过播…

CSS基础学习--11 padding(填充)

一、定义 CSS padding(填充)是一个简写属性,定义元素边框与元素内容之间的空间,即上下左右的内边距。 当元素的 padding(填充)内边距被清除时,所释放的区域将会受到元素背景颜色的填充。 单独使…

Linux运维监控学习笔记1

1. 监控系统的概念: 监控系统,将所有需要监控的服务器及其各种各种需要的状态数据都实时地收集,并图形化地展示,并可以进行报警,让机器主动及时地与人沟通。 2. 为什么要监控? 答:实时地收集数…

kubernetes(k8s)理论篇

注意:kubeadm与docker是有版本要求的。 如果版本不兼容,初始化 kubeadm是会出现以下问题。 学习k8s掌握知识 基础概念 什么是 Pod 控制器类型 K8S 网络通讯模式 Kubernetes 构建 K8S 集群 资源清单 资源 掌握资源清单的语法 编写 Pod 掌握 Pod 的…

JVM知识点整理

JVM 回收哪个区域?关联面试题:fullgc会回收方法区(元空间)吗? 怎么判断对象可以被回收了关联面试题:哪些对象可以作为 GC Root (两栈两方法) JVM GC什么时候执行?分代回收机制思考&…

docker容器启动的问题 - docker容器和虚拟机的比较 - docker的底层隔离机制

目录 一、docker容器启动的问题? 二、什么是docker仓库? 三、虚拟机和docker容器的区别: docker的优势: docker的缺点: 对比: 四、docker的底层隔离机制 参考文献:LXC linux容器简介——…