1、工厂模式
创建者不需要手动new一个要使用的对象,因为这样需要创建者对于对象实例的细节非常了解。以汽车生产为例,消费者想购买某种品牌的车,只需要到4s店进行消费,而不需要知道车的具体构造手动生产。工厂模式解决了这个问题。
使用了工厂模式的场景非常多:
- JDK中Calendar的getInstance方法
- JDBC中Connection对象的获取
- Spring中IOC容器创建管理bean对象
- 反射中Class对象的newInstance方法
- Mybatis中的sqlSessionFactory创建sqlSession对象
1.1、简单工厂模式
- 不同品牌的汽车都实现了Car接口,如果想购买大众、五菱不同的牌子,按照原来的方法需要手动new两个牌子的汽车实例。而汽车工厂(CarFactory)可以让用户输入汽车品牌,得到对应的汽车实例。
//消费者在消费时需要知道每个子类汽车品牌的具体参数,才能拿到具体车的实例
public class Consumer {
public static void main(String[] args) {
//1.不使用工厂方法直接创建
Car car1 = new WuLing();
Car car2 = new Tesla();
//2.使用简单工厂方法
CarFactory.product("WuLing");
CarFactory.product("Tesla");
}
}
//汽车工厂只要输入想要购买的汽车型号,就可以给消费者生产出来想要的汽车
public class CarFactory {
//但是如果要再新增一个汽车种类,基于必须更改本工厂方法
public static Car product(String carName){
if ("WuLing".equals(carName)) return new WuLing();
if ("Tesla".equals(carName)) return new Tesla();
return null;
}
}
1.2、工厂方法模式
- 简单工厂模式的基础上,如果想要新增一个汽车品牌,就需要对工厂进行改造,添加。这不符合设计模式的开闭原则(在对项目升级时,不对原有功能进行改动,只新增内容实现功能,达到横向拓展的目的)。
-
工厂方法模式另外抽象出了一个工厂接口,定义了不同汽车工厂生产汽车的共同行为Car product();
public interface CarMethodFactory { Car product(); }
-
不同的汽车工厂继承工厂接口并实现生产汽车的方法,达到生产不同品牌汽车的行为。
public class TeslaFactory implements CarMethodFactory{ @Override public Car product() { return new Tesla(); } }
-
消费者通过调用不同工厂的生产方法得到汽车实例。
//消费者在消费时需要知道每个子类汽车品牌的具体参数,才能拿到具体车的实例 public class Consumer { public static void main(String[] args) { //使用工厂方法 new DaZhongFactory().product(); new WuLingFactory().product(); new TeslaFactory().product(); } }
1.3、抽象工厂模式
- 在工厂方法模式的基础上,如果要新增一个产品种类,例如特斯拉不但生产汽车,还会生产电池,此时消费者想要购买特斯拉的电池,也不希望直接new一个出来。那么在工厂方法的基础上,将工厂再抽象一层,抽象工厂接口定义了产品种类的生产,多个品牌的工厂实现这个抽象工厂接口,重写生产方法,生产该品牌不同种类的产品(品牌:特斯拉,不同种类的产品:汽车,电池)
-
抽象工厂接口定义了产品种类的生产:
public interface IAbstractFactory { //抽象工厂定义--手机的生产 IPhone IphoneProduct(); //抽象工厂定义--路由器的生产 IRouter IRouterProduct(); }
-
多个品牌的工厂实现这个抽象工厂接口:
public class HuaWeiFactory implements IAbstractFactory{ @Override public IPhone IphoneProduct() { //工厂中会封装好生产华为手机的操作 return new HuaWeiPhone(); } @Override public IRouter IRouterProduct() { //工厂中会封装好生产华为路由器的操作 return new HuaWeiRouter(); } }
public class XiaoMiFactory implements IAbstractFactory{ @Override public IPhone IphoneProduct() { //工厂中会封装好生产小米手机的操作 return new XiaoMiPhone(); } @Override public IRouter IRouterProduct() { //工厂中会封装好生产小米路由器的操作 return new XiaoMiRouter(); } }