继续前言,工厂模式中抽象工厂模式的讲解:
1. 前面的工厂模式有啥问题?
前面的工厂模式有这么个问题:一个产品就给了一个工厂,这样子如果产品变多,系统就会很复杂:
2. 解决方法
我们可以按照手机、电脑这两种分类来定义抽象出工厂,这样子避免了工厂子类越来越多、系统越来越复杂的问题,像这样把产品类按照一定的规则进行分组,组内不同产品对应于同一工厂类不同方法的设计模式,就是抽象工厂模式( Abstract Factory Pattern )
3. 代码设计
按照上述逻辑,我们就以手机为例,设计一下代码:
/*** @Author: stukk* @Description: 苹果的产品接口* @DateTime: 2023-12-15 12:03**/
public interface IphoneProduct {void showIphone();
}/*** @Author: stukk* @Description: 苹果手机* @DateTime: 2023-12-15 12:07**/
public class Iphone implements IphoneProduct {@Overridepublic void showIphone() {System.out.println("我是苹果手机");}
}/*** @Author: stukk* @Description: 苹果电脑* @DateTime: 2023-12-15 12:07**/
public class Mac implements IphoneProduct {@Overridepublic void showIphone() {System.out.println("我是苹果电脑");}
}/*** @Author: stukk* @Description: 小米的产品接口* @DateTime: 2023-12-15 12:03**/
public interface MiProduct {void showMi();
}/*** @Author: stukk* @Description: 小米手机产品* @DateTime: 2023-12-15 12:04**/
public class MiPhone implements MiProduct {@Overridepublic void showMi() {System.out.println("我是小米手机....");}
}/*** @Author: stukk* @Description: 小米电脑产品* @DateTime: 2023-12-15 12:04**/
public class MiComputer implements MiProduct {@Overridepublic void showMi() {System.out.println("我是小米电脑....");}
}/*** @Author: stukk* @Description: 工厂接口* @DateTime: 2023-12-15 12:09**/
public interface Factory {
// 创建苹果的产品IphoneProduct createIphone();
// 创建小米的产品MiProduct createMi();}* @Author: stukk* @Description: 电脑工厂具体类* @DateTime: 2023-12-15 12:10**/
public class ComputerFactory implements Factory {@Overridepublic IphoneProduct createIphone() {return new Mac();}@Overridepublic MiProduct createMi() {return new MiComputer();}
}/*** @Author: stukk* @Description: 手机工厂具体类* @DateTime: 2023-12-15 12:10**/
public class PhoneFactory implements Factory {@Overridepublic IphoneProduct createIphone() {return new Iphone();}@Overridepublic MiProduct createMi() {return new MiPhone();}
}/*** @Author: stukk* @Description: 客户端* @DateTime: 2023-12-15 12:12**/
public class abstractFactoryExample {public static void main(String[] args) {
// 创建手机Factory factory = new PhoneFactory();IphoneProduct iphone = factory.createIphone();MiProduct mi = factory.createMi();iphone.showIphone();mi.showMi();
// 创建电脑factory = new ComputerFactory();IphoneProduct mac = factory.createIphone();MiProduct miComputer = factory.createMi();mac.showIphone();miComputer.showMi();}}
4. 工厂模式的实际应用
工厂模式在实际开发中也有很多的应用场景:
-
依赖注入(Dependency Injection):工厂模式用于实现依赖注入,通过工厂类来创建和提供依赖的对象。这样可以实现松耦合的组件之间的依赖关系,方便进行单元测试和代码维护。
-
多态对象的创建:工厂模式可以根据条件或参数的不同创建不同的具体对象,实现多态的对象创建。这样可以根据具体需求动态地创建不同类型的对象,提供更大的灵活性和可扩展性。
-
插件系统:工厂模式可以用于实现插件系统,通过工厂类动态地加载和创建插件对象。这样可以方便地扩展应用的功能,允许用户根据需求选择和切换不同的插件实现。
-
数据库访问:工厂模式可以用于创建数据库访问对象,根据不同的数据库类型创建相应的数据库连接、查询执行器等对象。这样可以实现数据库访问的抽象和统一管理,提供更好的可维护性和扩展性。
5.总结
普通工厂模式:
普通工厂模式定义了唯一工厂类,通过用户传入的type参数,使用if-else来生成返回对应来创建对象。
工厂方法模式:
工厂方法模式定义了给每个产品都定义了工厂类,用户可以直接调用对应的工厂类中的方法来创建对象,换句话说就是使用多态来解决这个if-else过多的问题
抽象工厂模式:
抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。