抽象工廠模式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

應用場景:

  1. 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
  2. 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
  3. 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构

java-設計模式-抽象工場模式的更多相关文章

  1. 簡單工廠模式-之-什麼是產品線 And 抽象工廠模式-之-什麼是產品族

    簡單工廠模式-之-什麼是產品線 簡單工廠模式中,有一個概念就是使用了多層次的產品結構,那麼什麼是產品結構或者說什麼是產品線? 假定我們有一個基準的產品標準Product,那麼所有繼承該基類或者傳遞基類 ...

  2. Java设计模式—工厂方法模式&抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

  3. java-設計模式-工場方法

      工廠方法: 一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中. 这满足创建型 ...

  4. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  5. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  6. Java设计模式(一)普通工场模式 抽象工场模式

    设计模式 设计模式是前人总结的,为了解决一类问题而总结的代码设计经验. 最初可能为了使用而使用,后面就会发现.非常多没想到的问题由于使用了正确的设计模式已经为你考虑到了.<design patt ...

  7. 《Java设计模式》之抽象工厂模式

    场景问题 举个生活中常见的样例--组装电脑.我们在组装电脑的时候.通常须要选择一系列的配件,比方CPU.硬盘.内存.主板.电源.机箱等. 为讨论使用简单点.仅仅考虑选择CPU和主板的问题. 其实,在选 ...

  8. 《JAVA设计模式》之抽象工厂模式(Abstract Factory)

    场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...

  9. 重学 Java 设计模式:实战抽象工厂模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

随机推荐

  1. scanf坑我的那些年

    scanf函数作为用户输入指令给计算机的一种输入方法,它的使用有如下几被坑点: scanf用法:#include<stdio.h>;scanf("格式控制符",地址表列 ...

  2. kali Linux openvas忘记密码的解决方法

    1.先删除默认的admin帐号root@xxs:~# openvasmd --delete-user=admin User deleted. 2.创建admin帐号,默认会生成密码root@xxs:~ ...

  3. Mac欺骗实验

    实验目的 1.掌握MAC欺骗的原理 2.学会利用MacMakeUp软件工具进行伪造源MAC地址的MAC欺骗. 实验内容 使用MacMakeUp伪造主机mac地址,进行mac欺骗实验. 实验环境描述 1 ...

  4. [题解]第十一届北航程序设计竞赛预赛——L.偶回文串

    题目描述 长度为偶数的回文串被称为偶回文串.如果一个字符串重新排序之后能够成为一个偶回文串,则称为可回文的. 给一个字符串,求可回文的子串个数.字符串只含小写字母,单个字符串长度不超过10^5,所有数 ...

  5. python数据结构:数组和列表

    线性结构有两种:数组和列表 array和list 其中list各项操作的时间复杂度如下 因为insert是在头部插入 所以列表所有元素后移,时间复杂度为O(n) remove移除列表中某个值的第一个匹 ...

  6. Map<String, String> map按key值排序

    private static String buildMd5Params(Map<String, String> map) { StringBuilder result = new Str ...

  7. 安装Android studio 并成功运行

    之前是在idea上弄得发现有些问题就下载了Android studio教程(4条消息) Android Studio安装及环境配置教程_xuw_xy的博客-CSDN博客_androidstudio安装 ...

  8. 4.Profile(多环境配置)

    在实际的项目开发中,一个项目通常会存在多个环境,例如,开发环境.测试环境和生产环境等.不同环境的配置也不尽相同,例如开发环境使用的是开发数据库,测试环境使用的是测试数据库,而生产环境使用的是线上的正式 ...

  9. Python3中__repr__和__str__区别

    示例: class Test(object): def __init__(self, value='hello, world!'): self.data = value >>> t ...

  10. Context包源码解析(附面经)

    Context包源码解析 Context就相当于一个树状结构 最后请回答一下这个问题:context包中的方法是线程安全吗? Context包中主要有一个接口和三个结构体 Context接口 type ...