抽象工厂模式

news2024/11/30 2:45:50

思考抽象工厂模式

抽象工厂专注于产品簇的实现,主要是那些有关联关系的,如果只有一个产品的话就退化成了工厂方法模式

1.抽象工厂模式的本质

抽象工厂模式的本质:选择产品簇的实现。

产品簇(Product family)指具有相同或相似的功能结构或性能,共享主要的产品特征、组件或子结构,并通过变型配置来满足特定市场的一组产品的聚类。

工厂方法是选择单个产品的实现,虽然一个类里面可以有多个工厂方法,但是这些方法之间一般是没有联系的,即使看起来像有联系。

但是抽象工厂着重的就是为一个产品簇选择实现,定义在抽象工厂里面的方法通常是有联系的,它们都是产品的某一部分或者是相互依赖的。如果抽象工厂里面只定义一个方法,直接创建产品,那么就退化成为工厂方法了。

2.何时选用抽象工厂模式

建议在以下情况中选用抽象工厂模式。

  • 如果希望一个系统独立于它的产品的创建、组合和表示的时候。换句话说,希望一个系统只是知道产品的接口,而不关心实现的时候。
  • 如果一个系统要由多个产品系列中的一个来配置的时候。换句话说,就是可以动态地切换产品簇的时候。
  • 如果要强调一系列相关产品的接口,以便联合使用它们的时候。

3.实现

cpu产品

/**
 * @description:cpu接口
 */
public interface Cpu {

    /**
     * 初始化cpu
     */
    void initCpu();
}

/**
 * @description:英特尔cpu
 */
public class IntelCpu implements Cpu{
    //针脚
    private int pins=0;

    public IntelCpu(int pins){
        this.pins=pins;
    }

    @Override
    public void initCpu() {
        System.out.println("Cpu-->英特尔 针脚数"+pins);
    }
}

/**
 * @description:AMDcpu
 */
public class AmdCpu implements Cpu{

    private int pins=0;

    public AmdCpu(int pins){
        this.pins=pins;
    }

    @Override
    public void initCpu() {
        System.out.println("Cpu-->AMD 针脚数"+pins);
    }
}

主板接口

/**
 * @description:主板接口
 */
public interface Mainboard {

    /**
     * 初始化主板
     */
    void initMainBoard();
}

/**
 * @description:华硕主板
 */
public class AsusMainboard implements Mainboard{
    //针脚
    private int pins=0;

    public AsusMainboard(int pins){
        this.pins=pins;
    }

    @Override
    public void initMainBoard() {
        System.out.println("Mainboard-->华硕 针脚数"+pins);
    }
}

/**
 * @description:微星主板
 */
public class MsiMainboard implements Mainboard{

    private int pins=0;

    public MsiMainboard(int pins){
        this.pins=pins;
    }

    @Override
    public void initMainBoard() {
        System.out.println("Mainboard-->微星 针脚数"+pins);
    }
}

抽象工厂

/**
 * @description:抽象工厂
 */
public interface AbstractFactory {

    /**
     * 创建cpu
     * @return
     */
    Cpu createCpu();

    /**
     * 创建主板
     * @return
     */
    Mainboard createMainboard();
}

/**
 * @description:自组电脑1 (英特尔cpu+华硕主板) 假设都是1156针脚
 */
public class CustomComputer1 implements AbstractFactory{
    @Override
    public Cpu createCpu() {
        return new IntelCpu(1156);
    }

    @Override
    public Mainboard createMainboard() {
        return new AsusMainboard(1156);
    }
}

/**
 * @description:自组电脑2 (AMDcpu + 微星主板) 假设都是963针脚
 */
public class CustomComputer2 implements AbstractFactory{
    @Override
    public Cpu createCpu() {
        return new AmdCpu(963);
    }

    @Override
    public Mainboard createMainboard() {
        return new MsiMainboard(963);
    }
}

组装类

/**
 * @description:工程师组装电脑
 */
public class Engineer {

    /**
     * cpu
     */
    private Cpu cpu=null;

    /**
     * 主板
     */
    private Mainboard mainboard=null;

    /**
     * 组装电脑
     * @param factory
     */
    public void makeComputer(AbstractFactory factory){
        cpu=factory.createCpu();
        mainboard=factory.createMainboard();

        cpu.initCpu();
        mainboard.initMainBoard();
    }

}

测试

public class Client {

    public static void main(String[] args) {
        Engineer engineer = new Engineer();
        //顾客想组装的电脑配置
        engineer.makeComputer(new CustomComputer1());
    }
}

类图
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Simulink电机控制代码生成-----关于PI控制器参数整定的一点总结

目录 PI控制器的参数整定方法 方法一: 方法二: 方法对比 总结 看过很多论文,对PI参数的整定方法五花八门,还有PI参数整定的口诀,所谓口诀就是试凑法。除了试凑法,本文提供另外两种方法来整定PI参数&am…

【JavaSE】类与对象--封装性

文章目录一、面向对象的三大特性二、封装性1.什么是封装性?2.为什么要有封装性?3.封装性的作用4.封装性的实现步骤5.访问限定修饰符一、面向对象的三大特性 面向对象的三个基本特征是:封装、继承、多态。 二、封装性 1.什么是封装性&#xf…

BLE学习(4):蓝牙地址类型和设备的隐私

蓝牙地址也被称为蓝牙MAC地址,它能唯一标识一个蓝牙设备的48位的值。在蓝牙规范中,它被称为BD_ADDR。蓝牙的地址类型可以分为两种:public addresses和random addresses,其中random addresses又可再细分为几类,如下图所…

centos7.8手动部署php环境 01 nginx1.8.0编译安装

环境说明: 一、使用电脑 MacBook Pro 二、ssh 工具 finalShell 三、本地虚拟机 VMware Fusion 四、服务器配置 CentOS 7.8 64位 ps:虚拟机安装CentOS省略 登录服务器 一、安装基础工具 yum install net-tools -y yum install wget -y二、将yum源更改为腾…

创新型智慧农业信息化系统建设方案

农业电信增值服务与农村信息化建设要充分考虑新的信息技术、移动通信技术带来的革命,尤其是三网融合、移动互联网、下一代互联网、物联网、云计算、移动支付等新型产品与业务对我们的影响。 存在问题 •网络覆盖基础差 仍然有很多行政村没有宽带网络的覆盖&#x…

TiDB HTAP

TiDB 数据库 HTAP 概述 HTAP技术 OLAP和OLTP带来了多副本的问题。 HTAP的要求 HTAP的架构 异步复制,不参与投票。 HTAP的特性 行列混合 列存支持基于主键的实时更新TiFlash作为列存副本OLTP和OLAP业务隔离 智能选择(CBO自动或者人工选择)…

IB数学的备战技巧有哪些?

去知名品牌院校进修是许多学员的理想,可是众所周知这些重点大学的入校规定是十分严谨的。因此许多学员为了更好地提高自身的入校概率,就报名参加了一些可以大大加分的国际课程内容和考試。在其中IB数学课则是最受众多学员钟爱的一个课程内容。近些年&…

PyTorch 官方库「上新」,TorchMultimodal 助力多模态人工智能

多模态人工智能是一种新型 AI 范式,是指图像、文本、语音、视频等多种数据类型,与多种智能处理算法相结合,以期实现更高的性能。 近日,PyTorch 官方发布了一个 domain library–TorchMultimodal,用于 SoTA 多任务、多模…

[Linux]----进程间通信之共享内存

文章目录前言一、system V共享内存原理二、创建共享内存关联和去关联共享内存进行通信三、基于管道进行共享内存通信四、临界资源五、信号量总结前言 基于上篇我们利用管道进行进程间通信的使用和实现,本篇将带大家通过共享内存进行进程间通信! 正文开始…

R9.8-9.8-9.8-9.8A_特点

R9.8-9.8-9.8-9.8A_特点 R9.8-9.8-9.8-9.8A_特点哈威柱塞泵主要特点是高自吸转速,工作效率高,结构紧凑,工作压力高等。该泵可为工程机械、铲雪车、路堤割草机、柴油叉车、自驱式工作平台和农业机械中的执行元件等提供压力油。 哈威液压泵R9.…

LIRA: Learnable, Imperceptible and Robust Backdoor Attacks 论文笔记

论文信息 论文名称LIRA: Learnable, Imperceptible and Robust Backdoor Attacks作者Khoa Doan(Baidu Research)会议/出版社ICCV 2021pdf📄在线pdf代码💻pytorch其他该作者还有一篇攻击的论文,在线pdf 介绍 本文提出了一种新的攻击框架 LIR…

技术中台的定义、范围与内容

【摘要】中台不能算是一个新的概念,只不过把它从一个单一系统扩展到了企业内部所有系统和组织级(企业架构级)的概念。那么时下“中台”的本质究竟是什么?技术中台又该如何理解? 前台、中台、后台的概念早就有之,只不过不同的场景下有不同的内涵。前中后台是从应用系统架…

T293037 [传智杯 #5 练习赛] 白色旅人

题目描述 有一个物品队列 \frak BB,初始时为空。现在共有三种操作。每个操作会给定三个整数 \mathrm{op},x,yop,x,y,其中 \mathrm{op}op 表示操作种类,x,yx,y 是操作的参数。操作分为如下三种: 11:向 \frak BB 尾部添…

React 简书项目实战【3】实现搜索框动画

React 简书项目实战【3】实现搜索框动画 添加判断变量 header/index.js 核心代码 ... class Header extends Component {constructor(props) {super(props);this.state {focused: true}}render() { ...添加classname header/index.js 核心代码 搜索框和放大镜图标 <…

手把手教你如何用界面组件DevExpress WPF应用一个模板主题

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF组件包…

VR失重太空舱游乐设备|航空航天VR体验|VR航天航空体验馆

普乐蛙推出了十几种不同类型的VR航天航空体验设备&#xff0c;VR创意内容丰富好玩&#xff0c;360全景还原航空各个场景&#xff0c;体验享受航空中的失重、飞行、旋转等刺 激与乐趣;模拟月球、太空、空间站等丰富航天场景&#xff0c;近距离体验航天科幻十足的魅力;通过沉浸式…

vue(移动端)使用高德地图实现精准定位

目录 效果图 前提准备 代码展示 效果图 两个页面 页面一&#xff08;粗略定位&#xff09; 点击城市进入页面二 &#xff08;粗略定位&#xff09;&#xff0c;搜索框输入具体位置&#xff08;以大连理工大学为例&#xff09; 点击大连理工大学&#xff0c;回到页面一&…

[附源码]java毕业设计校园淘宝节系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MongoDB Journaling工作原理

文章目录 小结当 mongod 进程启动后,首先将数据文件映射到 shared 视图中,假如数据文件的大小为 4000 个字节,它会将此大小的数据文件映射到内存中,地址可能为 1000000~1004000。如果直接读取地址为1000060的内存,我们将得到数据文件中第60个字节处的内容。有一点要注意,…

ElementUI的Form表单使用slot-scope=“scope“获取当前表格行数据实现数据回显、修改表单操作

在写项目时&#xff0c;老师通过向后端发请求获得表格原来的数据来填充修改表单里的数据。 这是表格&#xff1a; 这是点击修改按钮后显示出来的修改表单&#xff1a; 但本地里都已经有这些数据了&#xff0c;就没必要再发一次请求&#xff0c;徒增服务器压力。 准备 可是…