继续前言,工厂模式中抽象工厂模式的讲解:
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 {
@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. 工厂模式的实际应用
工厂模式在实际开发中也有很多的应用场景:
-
依赖注入(Dependency Injection):工厂模式用于实现依赖注入,通过工厂类来创建和提供依赖的对象。这样可以实现松耦合的组件之间的依赖关系,方便进行单元测试和代码维护。
-
多态对象的创建:工厂模式可以根据条件或参数的不同创建不同的具体对象,实现多态的对象创建。这样可以根据具体需求动态地创建不同类型的对象,提供更大的灵活性和可扩展性。
-
插件系统:工厂模式可以用于实现插件系统,通过工厂类动态地加载和创建插件对象。这样可以方便地扩展应用的功能,允许用户根据需求选择和切换不同的插件实现。
-
数据库访问:工厂模式可以用于创建数据库访问对象,根据不同的数据库类型创建相应的数据库连接、查询执行器等对象。这样可以实现数据库访问的抽象和统一管理,提供更好的可维护性和扩展性。
5.总结
普通工厂模式:
普通工厂模式定义了唯一工厂类,通过用户传入的type参数,使用if-else来生成返回对应来创建对象。
工厂方法模式:
工厂方法模式定义了给每个产品都定义了工厂类,用户可以直接调用对应的工厂类中的方法来创建对象,换句话说就是使用多态来解决这个if-else过多的问题
抽象工厂模式:
抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。