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

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

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

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

设计模式详解---抽象工厂模式_第1张图片

2. 解决方法

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

设计模式详解---抽象工厂模式_第2张图片

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 {

    @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过多的问题

抽象工厂模式:

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

你可能感兴趣的:(设计模式,Java开发,设计模式,抽象工厂模式)