设计模式-抽象工厂(创建型)

创建型-抽象工厂

角色

  1. 抽象工厂: 声明创建一个族产品对象的方法,每个方法对应一中产品,抽象工厂可以是接口,也可以是抽象类;
  2. 具体工厂: 实现抽象工厂接口,复杂创建具体的一族产品;
  3. 抽象产品:定义一类产品的公共接口,描述一类产品的特定行为或者属性;
  4. 具体产品:实现抽象产品接口,定义具体产品的特定行为和属性;

其中,一族的概念可根据业务情况进行分族。比如:形状,颜色可分为两个族,再比如,植物, 动物也可以分为两个族。族的概念根据区分维度不同可分为不同的族;

图解

在这里插入图片描述

实现案例

这个案例中按照年龄将人分为小孩,老年人,中年人三族,产品分为上衣、裤子、鞋子三个种类;其中实现了老年人和小孩两个族衣服的抽象工厂。

抽象产品类:

/** 上衣抽象类*/
public abstract class Jacket {
    public abstract void wearJacket();
}

/** 鞋子抽象类*/
public abstract class Shoes {
    public abstract void wearShoes();
}

/** 裤子抽象类*/
public abstract class Trousers {
    public abstract void wearTrousers();
}

具体产品类:

/** 小孩衣服的具体类*/

public class ChildishJacket extends Jacket {
    @Override
    public void wearJacket() {
        System.out.println("小孩的上衣");
    }
}
public class ChildishShoes extends Shoes {

    @Override
    public void wearShoes() {
        System.out.println("小孩的鞋子");
    }
}
public class ChildishTrousers extends Trousers {
    @Override
    public void wearTrousers() {
        System.out.println("小孩的裤子");
    }
}


/** 老年人衣服的具体类*/
public class OldJacket extends Jacket {
    @Override
    public void wearJacket() {
        System.out.println("老年人上衣");
    }
}
public class OldTrousers extends Trousers {
    @Override
    public void wearTrousers() {
        System.out.println("老年人的裤子");
    }
}
public class OldShoes extends Shoes {
    @Override
    public void wearShoes() {
        System.out.println("老年人的鞋子");
    }
}

抽象工厂类:

/** 生产衣服的抽象工厂*/
public abstract class AbstractClothesFactory {
    public abstract Jacket createJacket();
    public abstract Shoes createShoes();
    public abstract Trousers createTrousers();
}

具体工厂类:

/** 儿童衣服生产工厂*/
public class ChildishClothesFactory extends AbstractClothesFactory {
    private static ChildishClothesFactory INSTANCE = new ChildishClothesFactory();
    public static ChildishClothesFactory getInstance(){
        return INSTANCE;
    }
    @Override
    public Jacket createJacket() {
        return new ChildishJacket();
    }

    @Override
    public Shoes createShoes() {
        return new ChildishShoes();
    }

    @Override
    public Trousers createTrousers() {
        return new ChildishTrousers();
    }
}

/** 老年人衣服生产工厂*/
public class OldClothesFactory extends AbstractClothesFactory{
    private static OldClothesFactory INSTANCE = new OldClothesFactory();

    public static OldClothesFactory getInstance(){
        return INSTANCE;
    }

    @Override
    public Jacket createJacket() {
        return new OldJacket();
    }

    @Override
    public Shoes createShoes() {
        return new OldShoes();
    }

    @Override
    public Trousers createTrousers() {
        return new OldTrousers();
    }
}

使用:

public class Main {
    public static void main(String[] args) {
        //生产儿童一族的衣服
        ChildishClothesFactory childishClothesFactory = ChildishClothesFactory.getInstance();
        Jacket childishJacket = childishClothesFactory.createJacket();
        Shoes childishShoes = childishClothesFactory.createShoes();
        Trousers childishTrousers = childishClothesFactory.createTrousers();
        //生产老年人一族的衣服
        OldClothesFactory oldClothesFactory = OldClothesFactory.getInstance();
        Jacket oldJacket = oldClothesFactory.createJacket();
        Shoes oldShoes = oldClothesFactory.createShoes();
        Trousers oldTrousers = oldClothesFactory.createTrousers();

        childishJacket.wearJacket();
        oldJacket.wearJacket();
    }
}

总结

  1. 抽象工厂是生产一族的产品,族的概念可根据不同的业务规则区分。
  2. 扩展产品族非常困难。增加一个新的产品族需要修改抽象工厂和所有具体工厂的代码。
  3. 对于新增族来说,满足开闭原则,而对于新增产品来说,不满足开闭原则。

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

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

相关文章

[移动通讯]【无线感知-P2】[特征,算法,数据集】

前言: 这里面主要参考清华大学的杨峥教授,做一下无线感知的总结. 基本思想: 无线信号不仅可以传输数据,还可以感知环境信号发射机产生的无线电波 经由直射,反射,散射等多条路径传播,在信号接收机形成的多径叠加信号 携带反映环境特征…

Unreal项目修改名字

Unreal项目修改名字 前言修改Unreal Blueprints工程项目名字修改Unreal C工程项目名字 前言 Unreal项目修改名字还是比较麻烦的,针对纯蓝图工程和C工程有一些区别。 修改Unreal Blueprints工程项目名字 修改纯蓝图的Unreal项目还是比较简单的,只要两个…

hcia datacom学习(12):vlan间路由

不同vlan相当于不同网段,如果vlan间没有三层技术,那么它们就无法互相通信。 vlan间路由可以有3种方式: 1.直接使用路由器转发 *路由器本身不需要额外设置,只需配置端口ip作为网关即可。 *路由器不能处理带有vlan标签的数据帧&a…

vulnhub靶机实战_DC-4

下载 靶机下载链接汇总:https://download.vulnhub.com/使用搜索功能,搜索dc类型的靶机即可。本次实战使用的靶机是:DC-4系统:Debian下载链接:https://download.vulnhub.com/dc/DC-4.zip 启动 下载完成后,…

【PL理论】(5) F#:递归类型 | Immutability 特性(F#中值一旦定义就不会改变)

💭 写在前面:本文旨在探讨不可变数据结构在 F# 编程中的应用,特别是如何利用递归记录类型来表示和操作数值表达式。通过定义存储整数的二叉树和数值表达式的类型,我们将展示不可变性如何简化程序的理解和维护。文章将对比 F# 与命…

适合航天航空的国产FTP替代软件

在宇宙探索的旅程中,航空和航天领域总是站在科技的最前沿,对数据传输的要求特别高。随着信息量急剧增加和安全威胁的复杂化,传统的FTP软件已经不能满足这个高端领域的需要了。因此,找到一款适合航空和航天领域的FTP替代软件&#…

spring 解决循环依赖

在 spring 框架中,我们知道它是通过三级缓存来解决循环依赖的,那么它具体是怎么实现的,以及是否必须需要三级缓存才能解决循环依赖,本文来作相关介绍。 具体实现 先来看看它的三级缓存到底是什么,先看如下代码&#…

Nginx网站服务【☆☆☆】

市面上常用Linux的web服务器:apache、Nginx。 apache与nginx的区别? 最核心的区别在于NGINX采用异步非阻塞机制,多个连接可以对应一个进程;apache采用的是同步阻塞多进程/线程模型,一个连接对应一个进程。apache美国…

c++简略实现共享智能指针Shared_Ptr<T>

重点: 1.引用计数在堆上(原本应为原子变量) 2.引用计数增加减少需要加锁保证线程安全。 3.内部实现Release函数用于释放资源 4.未实现,增加自定义删除器可以将Release修改为模板函数,传入可调用参数。对于shared_p…

tomcat服务器之maxHttpHeaderSize

背景:在OA流程表单中,填写了200条数据,一提交,秒报400错误,且请求没有打到后端中(无报错日志),一开始以为是谷歌浏览器的问题,可百度上关于这个错误的解决方案都是清除缓…

docker实战流程:

Docker-compose是docker官方的开源项目,负责实现对docker容器的集群的快速编排(通过yaml文件docker-compose.yml管理写好容器之间的调用关系只需一个命令就能实现容器的通识开启或关闭)。 类比spring容器,spring管理的是bean而do…

vue3+uniapp

1.页面滚动 2.图片懒加载 3.安全区域 4.返回顶部,刷新页面 5.grid布局 place-self: center; 6.模糊效果 7.缩放 8.微信小程序联系客服 9.拨打电话 10.穿透 11.盒子宽度 12.一般文字以及盒子阴影 13.选中文字 14.顶部安全距离 15.onLoad周期函数在setup语法糖执行后…

PVE安装虚拟主机

本文记录PVE安装其他虚拟主机的步骤,以安装win-server为例。裸机安装PVE则不是本文主题。 准备文件 获取Windows系统镜像 win server镜像可以从官网获取普通Windows镜像可从MSDN获取此外,安装Windows系统还需要从PVE下载特殊驱动 获取Windows必要驱动 …

数据库(25)——多表关系介绍

在项目开发中,进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,各个表之间的结构基本上分为三种:一对多,多对多,一对一。 一对多 例如,一个学校可以有…

PromptPerfect:AI Prompt生成与优化专家

PromptPerfect:AI Prompt生成与优化专家 PromptPerfect是一款专业的AI Prompt生成与优化工具,旨在帮助用户解锁和最大化GPT-4、ChatGPT、Midjourney等先进AI模型的潜力。它通过智能生成和精细优化Prompt,帮助用户获得更精确、更相关、更高效…

Aws EC2,kubeadm方式安装kubernetes(k8s)

版本 docker版本:20.10.25 k8s版本(kubeadm,kubelet和kubectl):1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …

题号:BC19 题目:反向输出一个四位数

题号:BC19 题目:反向输出一个四位数 废话不多说,上题目: 解题思路: 我们发现可以用%和/两个操作符就可以解决。 代码如下: int main() {int a 0;scanf("%d ",& a);while (a){printf("%d "…

【实物+仿真设计】基于单片机的物流皮带传输监控系统设计

《基于单片机的物流皮带传输监控系统设计 实物仿真》 整体功能: 本设计采用以单片机为核心控制器,以及传感器检测部分作为输入部分,以报警、显示、洒水、排烟、电机停止模块作为输出部分,构成整个物流皮带传输监控系统。 本设计…

Kolmogorov–Arnold Networks (KAN) 即将改变 AI 世界

目录 一、说明 二、KAN介绍 2.1 什么是 Kolmogorov-Arnold Networks (KAN): 2.2 KAN 的秘诀,Splines! 2.3 了解KAN工作的最简单方法 三、KAN的主要优点 四、KAN 的 Python 实现 (PyKAN) 4.1 …

神经网络 | 深度学习背后的数学

神经网分析 机器学习处理的是数据,通过学习输入的数据,从而建立模型,以便预测新的数据的输出 按照类型可以进行如下分类 监督分类 非监督分类 强化学习 神经元 生物学中,人的大脑是由多个神经元互相连接形成网络而构成的。也…