一、概述
什么是工厂模式?工厂模式根据抽象程度的不同分为3种模式:简单工厂模式(也叫静态工厂模式)、工厂方法模式、抽象工厂模式。工厂模式是会经常用到的模式之一。工厂模式有以下优点:
- 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂 模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己 想要的产品。
- 对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调 用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
- 降低耦合度。产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无 需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来 说,产品所依赖的类都是透明的。
也有一些缺点:
- 类的个数容易过多,增加了复杂性;
- 也增加了系统的抽象性和理解度。
由于简单工厂模式不属于23种程序设计模式,所以不会再讲述相关使用,可以参考其他相应的文章。工厂方法模式为了解决简单工厂模式所出现的一些缺点而进行的改进。工厂 方法有4个核心结构:【抽象工厂】、【具体工厂】、【抽象产品】、【具体产品】。工厂方法模式中一个工厂只负责生产一种产品,这样就保证了工厂的唯一性,这个就是和抽象工厂模式最大的区别,关于抽象工厂模式会在下篇文章中再做相关说明。例如电脑工厂只生产电脑,不能生产其他产品。举个具体的产品例子,戴尔电脑和联想电脑,他们是不同的电脑实现,但都是有相同的生产电脑的抽象接口。下面就用代码来做具体例子。
二、使用
首先需要创建一个电脑的接口,所有电脑都有这些信息,这里只写了2个简单的获取电脑品牌与价格,还可以新增其他的,这里就不再举例了。
public interface ComputerInterface {
//品牌
String getName();
//价格
int getPrice();
}
再创建具体的电脑品牌。这里创建2个品牌:联想、戴尔。他们都实现了电脑的接口并有自己的值。
public class DellComputer implements ComputerInterface{
@Override
public String getName() {
return "戴尔电脑";
}
@Override
public int getPrice() {
return 5999;
}
}
public class LenovoComputer implements ComputerInterface{
@Override
public String getName() {
return "联想电脑";
}
@Override
public int getPrice() {
return 4999;
}
}
再是创建电脑的抽象工厂接口,从通用工厂接口中返回电脑接口,以便创建出具体的电脑。
public interface ComputerFactory {
ComputerInterface getComputerInterface();
}
最后就是具体的创建电脑工厂了,这里也是新建了联想、戴尔这两个具体电脑工厂,用来创建具体的电脑。
public class DellFactory implements ComputerFactory{
@Override
public ComputerInterface getComputerInterface() {
return new DellComputer();
}
}
public class LenovoFactory implements ComputerFactory{
@Override
public ComputerInterface getComputerInterface() {
return new LenovoComputer();
}
}
我们来进行测试一下。
ComputerFactory computerFactory1 = new LenovoFactory();
ComputerInterface computerInterface1 = computerFactory1.getComputerInterface();
Log.e(TAG, "品牌:" + computerInterface1.getName() + ",价格:" + computerInterface1.getPrice());
Log.e(TAG, "-----------------------------");
ComputerFactory computerFactory2 = new DellFactory();
ComputerInterface computerInterface2 = computerFactory2.getComputerInterface();
Log.e(TAG, "品牌:" + computerInterface2.getName() + ",价格:" + computerInterface2.getPrice());
打印输出如下。可以看到生产出了具体的电脑

三、总结
从上面的例子中,我们可以看到很明显的优点,你可以将创建类的业务逻辑与该类的实际逻辑分离开来,以及当需要创建一个新的品牌电脑时,比如惠普电脑,我们无需改动电脑抽象类以及电脑工厂抽象类,直接新建一个具体的惠普电脑类以及具体的惠普电脑工厂类即可。可见工厂方法模式遵循了开闭原则。
这个例子可能举的不完全合适,有的说如果想要新增或者修改电脑抽象的方法,那么每个子类中都会改变。这个确实是,在设计之初就要决定每个方法或者属性,不要再到后期来进行修改,也看到了工厂方法模式中,如果具体的产品较多,那么就会导致我们创建类的数量很多,后期再来修改,会导致任务很繁重并且容易出错。并且一个工厂只能生产相似性很高的产品,如果需要创建其他的不同产品就需要另建工厂,这样也会导致我们的类数量暴增。
github地址:github.com/leewell5717…