前言
很久都没有更新博客了,这些日子里一直在忙学校里的实训项目,正好赶着今天是五一劳动节,我可不是为了今天写文章可以获得五一勋章而更新的~~那么今天就和大家分享一下抽象工厂设计模式。废话不多说,我们直接步入正题吧!!!
一、什么是抽象工厂
抽象工厂模式(也称为工具(Kit)模式)是创建型设计模式之一,它提供一个创建一系列相关或相互依赖对象的接口(也可以是抽象类),而无需指定它们具体的类。为此,我们可以得知,抽象工厂和工厂方法一样,有四个角色:抽象工厂、具体工厂、抽象产品、具体产品。那抽象工厂和工厂方法有什么区别呢?这个大家先别着急,我们先根据一个实例感受一下抽象工厂,然后再和工厂方法进行比较。
二、应用实例
实例描述:某软件公司要推出一款新的手机游戏软件,该软件能够支持iOS、Android和WindowsPhone等多个智能手机操作系统平台,针对不同的手机操作系统,该游戏软件提供了不同的游戏操作控制(OperationController)类和游戏界面控制(InterfaceController)类,并提供相应的工厂类来封装这些类的初始化过程。软件要求具有较好的扩展性以支持新的操作系统平台,为了满足上述需求,试采用一种合理的设计模式对其进行设计。
问题很长,我相信大家和我一样,在读完要求后无从下手,但是大家不要着急,我们根据刚才抽象工厂的定义以及它的四个角色来分析这个问题。首先“支持iOS、Android和WindowsPhone等多个智能手机操作系统平台”中“iOS、Android和WindowsPhone”就是具体产品角色,而“提供了不同的游戏操作控制(OperationController)类和游戏界面控制(InterfaceController)类”这个就是抽象产品。那抽象工厂和具体工厂呢?先说具体工厂吧,这里的具体工厂就是生产具体操作系统下的游戏操作和游戏界面的工厂,因此抽象工厂简单理解就是可以生产很多种不同的操作系统下的游戏操作和游戏界面的工厂。很绕,很难理解,没关系,我们直接上类图,让大家一目了然!(老规矩:我们用抽象类实现)
- 类图
- 代码实现
抽象产品
package abstractproduct;
/**
* 项目名:abstractFactoryTest
* 包名:abstractproduct
* 类名:InterfaceController
* 描述:游戏界面控制抽象类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public abstract class InterfaceController {
public abstract void createGameInterFace();
}
package abstractproduct;
/**
* 项目名:abstractFactoryTest
* 包名:abstractproduct
* 类名:OperationController
* 描述:游戏操作控制抽象类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public abstract class OperationController {
public abstract void createGameOperation();
}
具体产品
package concreteproduct;
import abstractproduct.InterfaceController;
/**
* 项目名:abstractFactoryTest
* 包名:concreteproduct
* 类名:AndroidInterfaceController
* 描述:Android操作系统的游戏界面控制类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public class AndroidInterfaceController extends InterfaceController {
@Override
public void createGameInterFace() {
System.out.println("Android操作系统的游戏界面控制!!!");
}
}
package concreteproduct;
import abstractproduct.OperationController;
/**
* 项目名:abstractFactoryTest
* 包名:concreteproduct
* 类名:AndroidOperationController
* 描述:Android操作系统的游戏操作控制类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public class AndroidOperationController extends OperationController {
@Override
public void createGameOperation() {
System.out.println("Android操作系统的游戏操作控制!!!");
}
}
package concreteproduct;
import abstractproduct.InterfaceController;
/**
* 项目名:abstractFactoryTest
* 包名:concreteproduct
* 类名:iOSInterfaceController
* 描述:iOS操作系统的游戏界面控制类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public class IOSInterfaceController extends InterfaceController {
@Override
public void createGameInterFace() {
System.out.println("iOS操作系统的游戏界面控制!!!");
}
}
package concreteproduct;
import abstractproduct.OperationController;
/**
* 项目名:abstractFactoryTest
* 包名:concreteproduct
* 类名:iOSOperationController
* 描述:iOS操作系统的游戏操作控制类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public class IOSOperationController extends OperationController {
@Override
public void createGameOperation() {
System.out.println("iOS操作系统的游戏操作控制!!!");
}
}
package concreteproduct;
import abstractproduct.InterfaceController;
/**
* 项目名:abstractFactoryTest
* 包名:concreteproduct
* 类名:WindowsPhoneInterfaceController
* 描述:WindowsPhone操作系统的游戏界面控制类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public class WindowsPhoneInterfaceController extends InterfaceController {
@Override
public void createGameInterFace() {
System.out.println("WindowsPhone操作系统的游戏界面控制!!!");
}
}
package concreteproduct;
import abstractproduct.OperationController;
/**
* 项目名:abstractFactoryTest
* 包名:concreteproduct
* 类名:WindowsPhoneOperationController
* 描述:WindowsPhone操作系统的游戏操作控制类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public class WindowsPhoneOperationController extends OperationController {
@Override
public void createGameOperation() {
System.out.println("WindowsPhone操作系统的游戏操作控制!!!");
}
}
抽象工厂
package abstractfactory;
import abstractproduct.InterfaceController;
import abstractproduct.OperationController;
/**
* 项目名:abstractFactoryTest
* 包名:abstractfactory
* 类名:GameFactory
* 描述:游戏工厂抽象类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public abstract class GameFactory {
public abstract InterfaceController interfaceController();
public abstract OperationController operationController();
}
具体工厂
package concretefactory;
import abstractfactory.GameFactory;
import abstractproduct.InterfaceController;
import abstractproduct.OperationController;
import concreteproduct.AndroidInterfaceController;
import concreteproduct.AndroidOperationController;
/**
* 项目名:abstractFactoryTest
* 包名:concretefactory
* 类名:AndroidGameFactory
* 描述:Android操作系统游戏工厂类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public class AndroidGameFactory extends GameFactory {
/**
* 实现Android操作系统下的游戏界面控制
*/
@Override
public InterfaceController interfaceController() {
return new AndroidInterfaceController();
}
/**
* 实现Android操作系统下的游戏操作控制
*/
@Override
public OperationController operationController() {
return new AndroidOperationController();
}
}
package concretefactory;
import abstractfactory.GameFactory;
import abstractproduct.InterfaceController;
import abstractproduct.OperationController;
import concreteproduct.IOSInterfaceController;
import concreteproduct.IOSOperationController;
/**
* 项目名:abstractFactoryTest
* 包名:concretefactory
* 类名:iOSGameFactory
* 描述:iOS操作系统游戏工厂类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public class IOSGameFactory extends GameFactory {
/**
* 实现iOS操作系统下的游戏界面控制
*/
@Override
public InterfaceController interfaceController() {
return new IOSInterfaceController();
}
/**
* 实现iOS操作系统下的游戏操作控制
*/
@Override
public OperationController operationController() {
return new IOSOperationController();
}
}
package concretefactory;
import abstractfactory.GameFactory;
import abstractproduct.InterfaceController;
import abstractproduct.OperationController;
import concreteproduct.WindowsPhoneInterfaceController;
import concreteproduct.WindowsPhoneOperationController;
/**
* 项目名:abstractFactoryTest
* 包名:concretefactory
* 类名:WindowsPhoneGameFactory
* 描述:WindowsPhone操作系统游戏工厂类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public class WindowsPhoneGameFactory extends GameFactory {
/**
* 实现WindowsPhone操作系统下的游戏界面控制
*/
@Override
public InterfaceController interfaceController() {
return new WindowsPhoneInterfaceController();
}
/**
* 实现WindowsPhone操作系统下的游戏界面控制
*/
@Override
public OperationController operationController() {
return new WindowsPhoneOperationController();
}
}
测试类
import abstractfactory.GameFactory;
import abstractproduct.InterfaceController;
import abstractproduct.OperationController;
import concretefactory.IOSGameFactory;
/**
* 项目名:abstractFactoryTest
* 包名:无
* 类名:Demo
* 描述:抽象工厂测试类
* 作者:Cool_foolisher
* 开始时间:2023/5/1
* 完成时间:2023/5/1
* 版本:1.0
*/
public class Demo {
public static void main(String[] args) {
GameFactory gameFactory = new IOSGameFactory();
InterfaceController interfaceController = gameFactory.interfaceController();
OperationController operationController = gameFactory.operationController();
interfaceController.createGameInterFace();
operationController.createGameOperation();
}
}
结果
切换系统的时候只需改变这一行代码即可。
GameFactory gameFactory = new IOSGameFactory();
// 把上述代码换成下面代码,就可以切换为Android系统下的游戏控制。
// 同理其他系统也是,这里不在演示。
GameFactory gameFactory = new AndroidGameFactory();
结果
三、总结
以上就是抽象工厂的实现,相信大家通过实例已经感觉到抽象工厂与工厂方法的不同,现在我们来总结一下它们的区别:工厂方法模式针对的是一个产品结构,而抽象工厂针对的是多个产品结构,上一篇文章里,我们的工厂方法模式里的抽象产品就是搜索,而这一次抽象工厂模式里我们的抽象产品是游戏操作和游戏界面。当工厂生产的产品结构很多时,抽象工厂比工厂方法要更简单、高效。
最后我们在说明一下抽象工厂的优缺点。
- 优点:
- 抽象工厂隔离了具体类的生成,使得客户端不需要知道什么被创建,正是因为这种隔离,使得我们只需改变具体工厂的实例就可以改变软件系统的行为。
- 缺点:
- 新增产品结构麻烦,甚至需要修改抽象层代码,违背了开闭原则。
如果觉得我的这篇文章对您有帮助,欢迎大家动动小手给我点赞,对于抽象工厂模式有疑问的话,欢迎大家在评论留言!!!本人也是刚刚学习编程的小菜鸟,文章如有写的不对的地方,也欢迎大佬的指正!!!