java-設計模式-抽象工場模式
抽象工廠模式AbstractFactory
一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
工廠方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机,同种类称为同等级
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品

抽象工廠模式結構:

1抽象产品 (Abstract Product) 为构成系列产品的一组不同但相关的产品声明接口。 2具体产品 (Concrete Product) 是抽象产品的多种不同类型实现。 所有变体 (维多利亚/现代)
都必须实现相应的抽象产品 (椅子/沙发)。 3抽象工厂 (Abstract Factory) 接口声明了一组创建各种抽象产品的方法。 4具体工厂 (Concrete Factory) 实现抽象工厂的构建方法。 每个具体工厂都对应特定产品变体,
且仅创建此种产品变体。 5尽管具体工厂会对具体产品进行初始化, 其构建方法签名必须返回相应的抽象产品。 这样, 使用工厂类的客户
端代码就不会与工厂创建的特定产品变体耦合。 客户端 (Client) 只需通过抽象接口调用工厂和产品对象,
就能与任何具体工厂/产品变体交互。
例子
前景:
按钮和复选框将被作为产品。 它们有两个变体: macOS 版和 Windows 版。
抽象工厂定义了用于创建按钮和复选框的接口。
而两个具体工厂都会返回同一变体的两个产品。
客户端代码使用抽象接口与工厂和产品进行交互,同样的代码能与依赖于不同工厂对象类型的多种产品变体进行交互。
按鈕接口:
/**
* 所有button的父接口
*/
public interface Button {
void paint();
}
複選框接口
public interface Checkbox {
void paint();
}
GUI抽象工廠類:
public interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
按鈕兩種實現
public class MaxOsButton implements Button{
public void paint() {
System.out.println("MacOs Button");
}
}
public class WindowsButton implements Button{
public void paint() {
System.out.println("Windows Button");
}
}
複選框兩種實現
public class WindowsCheckbox implements Checkbox{
public void paint() {
System.out.println("Windows--Checkbox");
}
}
public class MacOSCheckbox implements Checkbox{
public void paint() {
System.out.println("MacOS-Checkbox");
}
}
GUI抽象工廠的兩種實現
public class MaxOSFactory implements GUIFactory{
public Button createButton() {
return new MaxOsButton();
}
public Checkbox createCheckbox() {
return new MacOSCheckbox();
}
}
public class WindowsFactory implements GUIFactory{
public Button createButton() {
return new WindowsButton();
}
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
appllication類,充當sever:
public class Application {
private Button button;
private Checkbox checkbox;
public Application(GUIFactory guiFactory){
this.button = guiFactory.createButton();
this.checkbox = guiFactory.createCheckbox();
}
public void paint(){
button.paint();
checkbox.paint();
}
}
client端
public class ClientTest {
public static void main(String[] args) {
/**
* 傳入max工廠具體實現具體實現工廠
*/
Application application =new Application(new MaxOSFactory());
application.paint();
/**
* 傳入windows工廠具體實現工廠
*/
System.out.println("###################");
Application application1 = new Application(new WindowsFactory());
application1.paint();
}
}
結果:
MacOs Button
MacOS-Checkbox
###################
Windows Button
Windows--Checkbox
應用場景:
- 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
- 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
- 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构
java-設計模式-抽象工場模式的更多相关文章
- 簡單工廠模式-之-什麼是產品線 And 抽象工廠模式-之-什麼是產品族
簡單工廠模式-之-什麼是產品線 簡單工廠模式中,有一個概念就是使用了多層次的產品結構,那麼什麼是產品結構或者說什麼是產品線? 假定我們有一個基準的產品標準Product,那麼所有繼承該基類或者傳遞基類 ...
- Java设计模式—工厂方法模式&抽象工厂模式
工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式. 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...
- java-設計模式-工場方法
工廠方法: 一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中. 这满足创建型 ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- Java设计模式(一)普通工场模式 抽象工场模式
设计模式 设计模式是前人总结的,为了解决一类问题而总结的代码设计经验. 最初可能为了使用而使用,后面就会发现.非常多没想到的问题由于使用了正确的设计模式已经为你考虑到了.<design patt ...
- 《Java设计模式》之抽象工厂模式
场景问题 举个生活中常见的样例--组装电脑.我们在组装电脑的时候.通常须要选择一系列的配件,比方CPU.硬盘.内存.主板.电源.机箱等. 为讨论使用简单点.仅仅考虑选择CPU和主板的问题. 其实,在选 ...
- 《JAVA设计模式》之抽象工厂模式(Abstract Factory)
场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
随机推荐
- CobaltStrike逆向学习系列(15):CS功能分析-BOF
这是[信安成长计划]的第 15 篇文章 0x00 目录 0x01 BOF功能分析 0x02 BOF功能执行 0x03 写在最后 其实在看过 RDI 与 DotNet 功能执行之后,BOF 的执行基本就 ...
- Windows原理深入学习系列-访问控制列表
这是[信安成长计划]的第 19 篇文章 0x00 目录 0x01 介绍 0x02 DACL 0x03 创建DACL 0x04 文件读取测试 0x05 进程注入测试 0x06 原理分析 Win10_x6 ...
- 【C# 线程】并发编程的基石——CAS机制
其实Java并发框架的基石一共有两块,一块是本文介绍的CAS,另一块就是AQS,后续也会写博客介绍. 什么是CAS机制 CAS机制是一种数据更新的方式.在具体讲什么是CAS机制之前,我们先来聊下在多线 ...
- 『无为则无心』Python日志 — 64、Python日志模块logging介绍
目录 1.日志的作用 2.为什么需要写日志 3.Python中的日志处理 (1)logging模块介绍 (2)logging模块的四大组件 (3)logging日志级别 1.日志的作用 从事与软件相关 ...
- Windows Server 2012 在桌面上显示”我的电脑”
转至:https://jingyan.baidu.com/article/f25ef2544f6883482c1b82e5.html Windows Server 2012 沒有快捷方式显示我的电脑到 ...
- 解决 “Project ERROR: Unknown module(s) in QT: webengine”以及“Your MaintenanceTool appears to be older than 3.0.2. .” 的办法
1.环境 Windows10,Qt5.8.0 2.问题描述 需要使用到WebEngineView组件,在工程.pro中增加webengine后,Qt Creator应用程序输出中打印了 Project ...
- docker 搭建php 开发环境 添加扩展redis、swoole、xdebug
docker-compose搭建lnmp 先决条件 首先需要安装docker 安装docker-compost 1.创建lnmp工作目录 #创建三个目录 mkdir lnmp && c ...
- github通过token提交代码
github通过token提交代码 生成token 个人头像->Setttings->Developer settings->Personal access tokens->G ...
- python+pytest接口自动化(6)-请求参数格式的确定
我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求.例如某个接口规定的请求主体的编码方式为 applicat ...
- yum安装zabbix-web-mysql出现[Errno 256] No more mirrors to try.
yum安装zabbix-web-mysql出现[Errno 256] No more mirrors to try.报错在CentOS7.X 使用yum 安装软件的时候 出现错误[Errno 256] ...