设计模式详解---抽象工厂模式

继续前言,工厂模式中抽象工厂模式的讲解:

1. 前面的工厂模式有啥问题?

前面的工厂模式有这么个问题:一个产品就给了一个工厂,这样子如果产品变多,系统就会很复杂:

2. 解决方法

我们可以按照手机、电脑这两种分类来定义抽象出工厂,这样子避免了工厂子类越来越多、系统越来越复杂的问题,像这样把产品类按照一定的规则进行分组,组内不同产品对应于同一工厂类不同方法的设计模式,就是抽象工厂模式( Abstract Factory Pattern )

3. 代码设计

按照上述逻辑,我们就以手机为例,设计一下代码:

java 复制代码
/**
 * @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 {

    @Override
    public void showIphone() {
        System.out.println("我是苹果手机");
    }
}

/**
 * @Author: stukk
 * @Description: 苹果电脑
 * @DateTime: 2023-12-15 12:07
 **/
public class Mac implements IphoneProduct {

    @Override
    public 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 {
    @Override
    public void showMi() {
        System.out.println("我是小米手机....");
    }
}

/**
 * @Author: stukk
 * @Description: 小米电脑产品
 * @DateTime: 2023-12-15 12:04
 **/
public class MiComputer implements MiProduct {
    @Override
    public 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 {

    @Override
    public IphoneProduct createIphone() {
        return new Mac();
    }

    @Override
    public MiProduct createMi() {
        return new MiComputer();
    }
}


/**
 * @Author: stukk
 * @Description: 手机工厂具体类
 * @DateTime: 2023-12-15 12:10
 **/
public class PhoneFactory implements Factory {

    @Override
    public IphoneProduct createIphone() {
        return new Iphone();
    }

    @Override
    public 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. 工厂模式的实际应用

工厂模式在实际开发中也有很多的应用场景:

  1. 依赖注入(Dependency Injection):工厂模式用于实现依赖注入,通过工厂类来创建和提供依赖的对象。这样可以实现松耦合的组件之间的依赖关系,方便进行单元测试和代码维护。

  2. 多态对象的创建:工厂模式可以根据条件或参数的不同创建不同的具体对象,实现多态的对象创建。这样可以根据具体需求动态地创建不同类型的对象,提供更大的灵活性和可扩展性。

  3. 插件系统:工厂模式可以用于实现插件系统,通过工厂类动态地加载和创建插件对象。这样可以方便地扩展应用的功能,允许用户根据需求选择和切换不同的插件实现。

  4. 数据库访问:工厂模式可以用于创建数据库访问对象,根据不同的数据库类型创建相应的数据库连接、查询执行器等对象。这样可以实现数据库访问的抽象和统一管理,提供更好的可维护性和扩展性。

5.总结

普通工厂模式:

普通工厂模式定义了唯一工厂类,通过用户传入的type参数,使用if-else来生成返回对应来创建对象。

工厂方法模式:

工厂方法模式定义了给每个产品都定义了工厂类,用户可以直接调用对应的工厂类中的方法来创建对象,换句话说就是使用多态来解决这个if-else过多的问题

抽象工厂模式:

抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。

相关推荐
vker5 小时前
第 1 天:单例模式(Singleton Pattern)—— 创建型模式
java·设计模式
晨米酱1 天前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机1 天前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 天前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤1 天前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机2 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript