本篇文章总结自 【狂神说Java抽象工厂模式】bilibili 狂神说Java抽象工厂模式
工厂模式本质:
- 实例化不用new,用工厂模式来代替
- 可选择实现类,创建对象统一管理和控制,从而将调用者与实现类解耦
先来看抽象工厂模式的结构图:
可以看到产品分支与工厂分支是独立开来的,产品分支分为多个产品接口,一个产品接口又可以有多个实现类。而工厂分支中的大工厂指定了可以生产哪些产品,其实现类(华为厂商或小米厂商)可以直接new出产品并返回。在测试类中需要某个厂商的某个产品时,直接new出需要的厂商并调用其获取产品的方法。
代码结构:
以下是手机产品接口:
//手机产品接口
public interface IPhoneProduct {
void start();
void end();
void call();
void sendMessage();
}
华为手机实现类:
//华为手机产品
public class HuaweiPhone implements IPhoneProduct {
@Override
public void start() {
System.out.println("华为手机开机");
}
@Override
public void end() {
System.out.println("华为手机关机");
}
@Override
public void call() {
System.out.println("华为手机打电话");
}
@Override
public void sendMessage() {
System.out.println("华为手机发短信");
}
}
小米手机实现类与华为手机实现类类似,路由器产品结构跟手机产品结构类似,不放出代码
以下是大工程的接口:
//生产各类产品的大工厂
public interface ProducingFactory {
IPhoneProduct producingPhone(); // 生产手机
IRouterProduct producingRouter(); // 生产路由器
}
以下是华为厂商实现类:
//华为工厂 可以生产华为手机与华为路由器
public class HuaweiFactory implements ProducingFactory {
@Override
public IPhoneProduct producingPhone() {
return new HuaweiPhone();
}
@Override
public IRouterProduct producingRouter() {
return new HuaweiRouter();
}
}
以下是小米厂商实现类:
//小米工厂 可以生产小米手机与小米路由器
public class XiaomiFactory implements ProducingFactory {
@Override
public IPhoneProduct producingPhone() {
return new XiaomiPhone();
}
@Override
public IRouterProduct producingRouter() {
return new XiaomiRouter();
}
}
测试方法:
public static void main(String[] args) {
//华为系列产品
HuaweiFactory huaweiFactory = new HuaweiFactory();
IPhoneProduct huaweiPhone = huaweiFactory.producingPhone();
huaweiPhone.call();
IRouterProduct huaweiRouter = huaweiFactory.producingRouter();
huaweiRouter.openNet();
//小米系列产品
XiaomiFactory xiaomiFactory = new XiaomiFactory();
IPhoneProduct xiaomiPhone = xiaomiFactory.producingPhone();
xiaomiPhone.call();
IRouterProduct xiaomiRouter = xiaomiFactory.producingRouter();
xiaomiRouter.openNet();
}
该设计模式优缺点:
优点:
- 厂商是具有可扩展性的,可有多个厂商去生产手机与路由器
- 厂商可以将一个系列的产品放到一起创建
- 调用者无需关心产品的创建过程,只需要获取工厂即可
缺点:
- 如果要生产更多的产品就必须要改动大工厂,厂商也需改动,产品集合被固定了
- 应用场景:
JDK中Calendar的getlInstance方法
JDBC中的Connection对象的获取
Spring中IOC容器创建管理bean对象
反射中Class对象的newInstance方法