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 沉淀.分享.成长,让自己和他人都能有所收获!
随机推荐
- 攻防世界 MOBILE RemeberOther
解题思路: 下载后解压可以得到一个apk文件和word文件.查看word文件,里面写了比较简单的一句话,未获有有效信息.(后续会讲到这个word文档的使用) word内容 运行apk文件,如图: ap ...
- 使用教程:宝塔服务器管理助手Linux面版
网页提示:宝塔Linux面板初始化成功,点击登陆页面:直接使用初始化配置时填写的帐号及密码登陆面板功能:网站管理.FTP管理.数据库管理.系统安全.文件管理.计划任务.环境设置. 方法/步骤1: 使用 ...
- npm install 报错:command failed git -c core.longpaths
最近需要angularjs,从github上下载下来程序,在安装目录下执行命令 npm install(安装依赖包)时报错了.
- linux中()、[]、{}、(())、[[]]等各种括号的使用
转至:https://www.jianshu.com/p/b88c7e07aaa9 linux中().[].{}.(()).[[]]等各种括号的使用 1.小括号.圆括号() 1.1 单小括号() 命令 ...
- xlrd》操作excel 出现的问题:File "D:\python37\lib\site-packages\xlrd\formula.py", line 1150, in evaluate_name_formula assert len(tgtobj.stack) == 1
xlrd>操作excel 出现的问题 报错如下: D:\python37\python.exe D:/testWang/waimai/tools/get_excelData.py*** for ...
- Qt:QDateTime、QDate、QTime与QDateTimeEdit
时间日期是经常遇到的数据类型,Qt中的时间日期类如下: QTime:时间类型,只表示时间,如15:23:13: QDate:日期类型,只表示日期,如2017-4-5: QDateTime:日期时间类型 ...
- 进程&线程(一)——multiprocessing,threading
本节内容为①进程线程的基础知识:②在Python的实现方法: 学习总结自: 一文看懂Python多进程与多线程编程(工作学习面试必读) - 知乎 multiprocessing 官方文档 1.进程线程 ...
- Pycharm:如果想验证一个文件中的函数
在该文件的函数后写上两句 def test(): pass if __name__='__main__': test() 这样就可以执行该函数 如果只是在其他文件中导入了该函数,则不会执行最后两段话, ...
- vcpkg 换源
vcpkg 的下载速度饱受诟病已久,但是并不见官方团队的动作,虽然有人提了 issue,但是提交的代码并不符合要求. 我自己在下载包的时候,特别是在下载位于 github 的包时,下载直接中断,所以我 ...
- Linux备份数据库,mysqldump命令实例详解
mysqldump是mysql数据库中备份工具,用于将MYSQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中. 语法: mysqldump (选项) 选项: --add-drop-ta ...