工厂设计模式

x33g5p2x  于2021-11-16 转载在 其他  
字(1.6k)|赞(0)|评价(0)|浏览(265)

工厂设计模式简介

我们都知道现实世界中,工厂的作用就是批量制造东西的。在设计模式中,工厂设计模式也是用来批量制造物体的,这个物体就是对象。
工厂设计模式的身影常常在框架中使用,比如著名的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这种容器管理框架就是利用发射+工厂设计模式来实现的。

要不要用工厂模式?

如果我们创建对象的业务逻辑并不复杂,那么不推荐使用工厂模式。

如果创建对象的逻辑比较复杂,还是推荐使用工厂模式来创建对象,这样的话,可以使代码更加易懂和清晰。要不然创建对象的代码会使主代码变得十分混乱。

相关文章