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

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

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

抽象工厂模式:

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

相关推荐
龙哥·三年风水5 小时前
活动系统开发之采用设计模式与非设计模式的区别-后台功能总结
设计模式·php·tinkphp6
一头老羊6 小时前
前端常用的设计模式
设计模式
严文文-Chris7 小时前
【设计模式-组合】
设计模式
kimloner8 小时前
工厂模式(二):工厂方法模式
java·设计模式·工厂方法模式
丶白泽10 小时前
重修设计模式-结构型-桥接模式
java·设计模式·桥接模式
南郁11 小时前
把设计模式用起来!(3)用不好模式?之时机不对
设计模式
Lill_bin13 小时前
Lua编程语言简介与应用
开发语言·数据库·缓存·设计模式·性能优化·lua
瞅瞅水15 小时前
设计模式中工厂模式的C语言实现
设计模式
SchneeDuan17 小时前
iOS六大设计原则&&设计模式
ios·设计模式·cocoa·设计原则
Book_熬夜!19 小时前
Python基础(十)——闭包、装饰器、设计模式与多线程编程
开发语言·python·设计模式