前言
抽象工厂模式适用于品牌不同,但种类相同的项目,如下图所示:
抽象工厂结构
抽象工厂由四个角色组成:
- 抽象工厂(Abstract Factory):将不同的种类抽象到工厂类里:IAbstractFactory
- 具体工厂(Concrete Factory):用不同工厂对接不同的品牌种类:HwFactoryImpl、MiFactoryImpl
- 抽象产品(Product):将种类抽象到接口里:IPhoneProduct、IRouterProduct
- 具体产品(ConcreteProduct):具体实现功能,例如小米手机的开关机,华为手机开关机等
详细代码
抽象工厂
public interface IAbstractFactory {
// 手机
IPhoneProduct phoneFactory();
// 路由器
IRouterProduct routerFactory();
}
具体工厂
public class MiFactoryImpl implements IAbstractFactory {
// 负责对接小米手机产品
@Override
public IPhoneProduct phoneFactory() {
return new MiPhoneProductImpl();
}
// 负责对接小米路由器产品
@Override
public IRouterProduct routerFactory() {
return new MiRouterProductImpl();
}
}
public class HwFactoryImpl implements IAbstractFactory {
// 负责对接华为手机产品
@Override
public IPhoneProduct phoneFactory() {
return new HwPhoneProductImpl();
}
// 负责对接华为路由器产品
@Override
public IRouterProduct routerFactory() {
return new HwRouterProductImpl();
}
}
抽象产品
// 手机产品
public interface IPhoneProduct {
void start();
void end();
}
// 路由器产品
public interface IRouterProduct {
void start();
void end();
}
具体产品
// 华为手机产品功能实现
public class HwPhoneProductImpl implements IPhoneProduct {
@Override
public void start() {
System.out.println("华为手机开机");
}
@Override
public void end() {
System.out.println("华为手机关机");
}
}
// 华为路由器产品功能实现
public class HwRouterProductImpl implements IRouterProduct {
@Override
public void start() {
System.out.println("华为路由器开机");
}
@Override
public void end() {
System.out.println("华为路由器关机");
}
}
// 小米手机产品功能实现
public class MiPhoneProductImpl implements IPhoneProduct {
@Override
public void start() {
System.out.println("小米手机开机");
}
@Override
public void end() {
System.out.println("小米手机关机");
}
}
// 小米路由器产品功能实现
public class MiRouterProductImpl implements IRouterProduct {
@Override
public void start() {
System.out.println("小米路由器开机");
}
@Override
public void end() {
System.out.println("小米路由器关机");
}
}
具体使用
public static void main(String[] args) {
// 创建小米工厂
IAbstractFactory miFactory = new MiFactoryImpl();
// 获取小米手机产品
IPhoneProduct miPhone = miFactory.phoneFactory();
miPhone.start();
miPhone.start();
// 获取小米路由器产品
IRouterProduct miRouter = miFactory.routerFactory();
miRouter.start();
miRouter.end();
// 创建华为工厂
IAbstractFactory hwFactory = new HwFactoryImpl();
// 获取华为手机产品
IPhoneProduct hwPhone = hwFactory.phoneFactory();
hwPhone.start();
hwPhone.end();
// 获取华为路由器产品
IRouterProduct hwRouter = hwFactory.routerFactory();
hwRouter.start();
hwRouter.end();
}
优缺点
优点
- 将一个不同品牌相同种类绑定在一起,在使用上非常方便,也更容易理解。
- 解耦:工厂统一管理,和实际调用代码分开
- 不变种类的情况下,新增一个品牌非常简单,也符合OCP原则(在设计时,应当可以在不被修改的情况下扩展)
缺点
- 新增一个种类相对比较麻烦,比如增加一个平板