工厂设计模式
该设计模式解决的问题是:将类实例化的操作与使用对象的操作分开,让使用者不用知道具体参数就可以实例化出所需要的产品类,从而避免了在客户端代码中显式指定,实现了解耦。
该设计模式分为三种实现
- 简单工厂设计模式
- 工厂方法实现模式
- 抽象工厂实现模式
简单工厂设计模式
一个汽车工厂生产汽车。有特斯拉、大众、五菱
车的接口
1 | public interface Car { |
大众
1 | public class DaZhong implements Car{ |
特斯拉
1 | public class TeSiLa implements Car{ |
五菱
1 | public class WuLin implements Car{ |
工厂
1 | public class CarFactory { |
缺点:很难横向拓展,如果我后期需要加新的车型,需要改变原来的代码,不符合开闭原则(OOP七大原则)
优点:简单易懂
可以简单优化
1 | public class CarFactory { |
工厂方法实现模式
还是简单工厂的模型,我们来换个工厂
这一次我们定义一个汽车工厂的接口
1 | public interface CarFactory { |
特斯拉工厂
1 | public class TeSiLaCarFactory implements CarFactory{ |
大众工厂
1 | public class DaZhongCarFactory implements CarFactory{ |
五菱工厂
1 | public class WuLinCarFactory implements CarFactory{ |
缺点:当汽车类型很多的时候,会有很多很多很多各自的工厂,没有必要
抽象工厂实现模式
这次我们换一个场景:小米和华为都有路由器和手机的产品
路由器接口
1 | public interface Router { |
手机接口
1 | public interface MobilePhone { |
厂家接口
1 | public interface ProductFactory { |
华为手机
1 | public class HuaWeiMobilePhone implements MobilePhone { |
华为路由器
1 | public class HuaWeiRouter implements Router { |
小米路由器
1 | public class XiaoMiRouter implements Router { |
小米手机
1 | public class XiaoMiMobilePhone implements MobilePhone { |
华为厂商
1 | public class HuaWeiFactory implements ProductFactory { |
小米厂商
1 | public class XiaoMiFactory implements ProductFactory { |
两个维度,第一个维度是产品族(路由器、手机),第二个维度是具体厂商(华为,小米)。
根据这两种维度分别设计了接口,抽象的工厂定义生产哪些产品族,具体的工厂具体实现自己的产品族