我们都知道现实世界中,工厂的作用就是批量制造东西的。在设计模式中,工厂设计模式也是用来批量制造物体的,这个物体就是对象。
工厂设计模式的身影常常在框架中使用,比如著名的spring,就是使用的工厂模式来生成和管理对象的。
常用的工厂模式有两种:简单工厂和工厂方法。
public class FoodFactory{
public static Food createFood(String className){
if(className.equals("fruit")){
return new Fruit();
}else if(className.equals("meat")){
return new Meat();
}
return null;
}
}
上面的代码就是一个简单的工厂设计模式,用户可以通过传入不同的className来获取不同的对象。
简单工厂的缺点就是如果我们要新增一种类,那么需要改动工厂类里面的代码,这就违背了开闭原则。新加入一个if分支。如果创建对象的逻辑不复杂还好,如果太复杂的话,就造成FoodFactory中的createFood()方法太臃肿。
相对于简单工厂,工厂方法利用多态,将if 语句转化为了多个子工厂,用户直接调用对应的子工厂来创建对象。
public interface FoodFactory{
Food createFood();
}
//子工厂
public class FruitFoodFactory implements FoodFactory{
public Food createFood() {
return new Fruit();
}
}
//子工厂
public class MeatFoodFactory implements FoodFactory {
public Food createFood() {
return new Meat();
}
}
public class Test{
public static void main(String[] args){
//先通过创建子工厂,然后通过子工厂来创建对象
FoodFactory foodFactory = new FruitFoodFactory();
Food food = foodFactory.createFood();
}
}
当新增类的时候,只要新增对应的子工厂就可以了,不用改动其他类的代码,遵循开闭原则。
而且 当创建对象的逻辑比较复杂的时候,工厂方法可以在每个单独的子工厂来分别创建对应的对象,而不是将所有的对象逻辑都杂糅在一个方法里面。
当我们需要通过一个变量来创建对应的对象的时候,我们可以对工厂类建立一个工厂
public class FoodFactoryMap{
Map<String,FoodFactory> map = new HashMap<>();
static{
map.put("fruit",new FruitFoodFactory());
map.put("meat",new MeatFoodFactory());
}
public static FoodFactory(String className){
return map.get(className);
}
}
这样的话,当我们需要新增类的时候,还是会违背开闭原则,在map中加入新的工厂类。
当我们需要动态的创建对象的时候,我们不可能将所有的类都加入到对应的工厂类中,这是就需要利用Java中的反射了。
Java中的反射允许通过一个类名来动态的创建对象。
但是Java反射的效率比较慢,能不使用就不要使用。
Spring这种容器管理框架就是利用发射+工厂设计模式来实现的。
如果我们创建对象的业务逻辑并不复杂,那么不推荐使用工厂模式。
如果创建对象的逻辑比较复杂,还是推荐使用工厂模式来创建对象,这样的话,可以使代码更加易懂和清晰。要不然创建对象的代码会使主代码变得十分混乱。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_40276626/article/details/121343684
内容来源于网络,如有侵权,请联系作者删除!