设计模式-抽象工厂模式
本文我们简单说下设计模式中的工厂方法模式。
概述
我们知道,在工厂方法模式中,通过为每个产品创建一个工厂的方式,没增加一个产品只需要增加一个产品类,然后实现这个产品类的工厂,解决了简单工厂模式的不满足开闭原则的问题。
那么有这么一种场景,随着工厂业务场景的增加,产品的类型也不断的增加,如果还是为每个产品都创建一个工厂类,那么代码中势必会出现大量的工厂类,增加系统的开销,也不好维护。
此时我们就考虑,是不是可以把一些相关联的产品归纳成一个产品族,交由同一个工厂进行管理。比如,华为工厂,生产手机,路由器,平板等;小米工厂也有手机,路由器,平板等,把这些相关的产品交由同一工厂进行管理,就是抽象工厂。
优点:
- 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
- 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
应用场景:
比如:我们项目中有这么一个场景:我们的标签分多个渠道,不同渠道的标签是从不同的原系统中同步过来,不同渠道的标签的同步逻辑也是不一样的。
还有个问题就是每次同步标签之前,会先判断这个原系统的标签有没有更新,如果原系统标签有变更才会进行同步;如果原系统标签没有变更,则不进行同步,同时提示用户,标签已经是最新版本。
我们就采用了抽象工厂模式,对不同渠道的标签、不同原系统标签判断是否有更新需要同步,交由不同渠道的工厂来管理。
实现
代码结构
代码实现
ProductFactory
java
/**
* @Author: ITender
* @CreateTime: 2022-02-17 23:16
*/![在这里插入图片描述](https://img-blog.csdnimg.cn/76edb7bda3204793a0e6c49c81aa3560.png#pic_center)
public interface ProductFactory {
/**
* 手机产品族
*
* @return
*/
PhoneProduct createPhone();
/**
* 路由器产品族
*
* @return
*/
RouterProduct createRouter();
}
HuaweiFactory
java
/**
* @Author: ITender
* @Description:
* @CreateTime: 2022-02-17 23:21
*/
public class HuaweiFactory implements ProductFactory {
@Override
public PhoneProduct createPhone() {
System.out.println("华为工厂,生产华为手机!");
return new HuaweiPhone();
}
@Override
public RouterProduct createRouter() {
System.out.println("华为工厂,生产华为路由器!");
return new HuaweiRouter();
}
}
XiaomiFactory
java
/**
* @Author: ITender
* @Description:
* @CreateTime: 2022-02-17 23:20
*/
public class XiaomiFactory implements ProductFactory {
@Override
public PhoneProduct createPhone() {
System.out.println("小米工厂,生产小米手机!");
return new XiaomiPhone();
}
@Override
public RouterProduct createRouter() {
System.out.println("小米工厂,生产小米路由器!");
return new XiaomiRouter();
}
}
PhoneProduct
java
/**
* @Author: ITender
* @Description:
* @CreateTime: 2022-02-17 23:04
*/
public interface PhoneProduct {
/**
* 手机打电话
*/
void call();
}
HuaweiPhone
java
/**
* @Author: ITender
* @Description:
* @CreateTime: 2022-02-17 23:06
*/
public class HuaweiPhone implements PhoneProduct {
@Override
public void call() {
System.out.println("华为手机打电话!");
}
}
XiaomiPhone
java
/**
* @Author: ITender
* @Description:
* @CreateTime: 2022-02-17 23:08
*/
public class XiaomiPhone implements PhoneProduct {
@Override
public void call() {
System.out.println("小米手机打电话!");
}
}
RouterProduct
java
/**
* @Author: ITender
* @CreateTime: 2022-02-17 23:09
*/
public interface RouterProduct {
/**
* 路由器wifi
*/
void wifi();
}
HuaweiRouter
java
/**
* @Author: ITender
* @Description:
* @CreateTime: 2022-02-17 23:10
*/
public class HuaweiRouter implements RouterProduct {
@Override
public void wifi() {
System.out.println("华为路由器wifi!");
}
}
XiaomiRouter
java
/**
* @Author: ITender
* @Description:
* @CreateTime: 2022-02-17 23:13
*/
public class XiaomiRouter implements RouterProduct {
@Override
public void wifi() {
System.out.println("小米路由器wifi!");
}
}
- 测试代码
java
/**
* @Author: ITender
* @Description:
* @CreateTime: 2022-02-17 23:25
*/
public class Consumer {
public static void main(String[] args) {
System.out.println("===========小米产品===============");
XiaomiFactory xiaomiFactory = new XiaomiFactory();
PhoneProduct xiaomiPhone = xiaomiFactory.createPhone();
xiaomiPhone.call();
RouterProduct xiaomiRouter = xiaomiFactory.createRouter();
xiaomiRouter.wifi();
}
}
- 输出
text
===========小米产品===============
小米工厂,生产小米手机!
小米手机打电话!
小米工厂,生产小米路由器!
小米路由器wifi!