工厂模式
1. 简单工厂模式
结构:
- 抽象产品: 定义产品规范, 描述产品功能
- 具体产品: 实现抽象产品的功能
- 具体工厂: 提供创建产品的方法, 调用者通过该方法来创建产品
抽象产品:
public interface Phone {
void call();
}
实现类:
public class XiaoMi implements Phone {
public void call() {
System.out.println("小米");
}
}
public class HuaWei implements Phone {
public void call() {
System.out.println("华为");
}
}
public class Apple implements Phone {
public void call() {
System.out.println("苹果");
}
}
简单工厂:
public class SimpleFactory {
public Phone getPhone(String name) {
Phone phone = null;
if(name.equals("小米")) {
phone = new XiaoMi();
} else if(name.equals("华为")) {
phone = new HuaWei();
} else if (name.equals("苹果")) {
phone = new Apple();
}
//增加产品会很繁琐
return phone;
}
}
优点:
- 封装了创建对象的过程, 可以直接通过参数获取对象, 如果要添加新对象, 只需要修改工厂类代码而不需要修改业务代码, 易于扩展
缺点:
- 要增加产品必须修改代码,不遵循开闭原则,不适合产品经常变化的场景
2. 抽象工厂模式
-
不负责增加产品,只需要增加产品接口之后交给实现类去增加,抽象工厂可以解决一系列的产品生产的需求当产品多时抽象工厂可以很好的进行管理和扩展
-
和简单工厂模式比较:如果产品种类比较确定那么应该使用简单工厂模式,如果产品种类多变应该使用抽象工厂模式
-
定义产品接口
public interface IPhoneProduct { void open(); void close(); void call(); } // 增加该产品只需要定义该接口然后添加实现类即可 // 不必像简单工厂模式一样 public interface IRouterProduct { void open(); void close(); }
-
实现接口
public class MIPhone implements IPhoneProduct { public void open() { System.out.println("小米开机"); } public void close() { System.out.println("小米关机"); } public void call() { System.out.println("小米打电话"); } } public class HWPhone implements IPhoneProduct{ public void open() { System.out.println("华为开机"); } public void close() { System.out.println("华为关机"); } public void call() { System.out.println("华为打电话"); } } public class HWRouter implements IRouterProduct { public void open() { System.out.println("华为路由器开机"); } public void close() { System.out.println("华为路由器关机"); } } public class MIRouter implements IRouterProduct { public void open() { System.out.println("小米路由器开机"); } public void close() { System.out.println("小米路由器关机"); } }
-
抽象工厂类
// 定义工厂类接口 public interface IProductFactory { IPhoneProduct getPhone(); IRouterProduct getRouter(); } public class HWFactory implements IProductFactory { public IPhoneProduct getPhone() { return new HWPhone(); } public IRouterProduct getRouter() { return new HWRouter(); } } public class MIFactory implements IProductFactory { public IPhoneProduct getPhone() { return new MIPhone(); } public IRouterProduct getRouter() { return new MIRouter(); } }
优点:
- 当一个产品族中的多个对象被设计成一起工作时, 可以保证始终使用的是同一个产品族的对象
缺点:
- 当新增一个产品时, 所有的工厂类都要修改
3. 工厂方法模式
- 工厂方法模式就是每一个产品都拥有自己的工厂,需要哪个产品就去找对应的工厂生产
- 虽然满足了开闭原则,但是当需要的产品很多时要创建很多工厂类
- 和简单工厂模式进行比较:工厂方法模式结构更为复杂,代码量更大,并且相比较于简单工厂更难于管理,所以工厂方法模式虽然满足设计原则,但并不适合实际运用,实际中简单工厂更加实用
- 定义工厂接口:
public interface PhoneFatory { Phone getPhone(); }
- 创建工厂实现类
public class MiFactory implements PhoneFatory { public Phone getPhone() { return new XiaoMi(); } } public class HwFactory implements PhoneFatory { public Phone getPhone() { return new HuaWei(); } }
优点:
- 用户只需要具体工厂名称就可得到想要的对象,
- 新增产品时, 只需要添加对应的具体产品类和具体工厂类
缺点:
- 每增加一个新的产品就要增加对应的具体产品和具体工厂类, 增加系统复杂度