简单工厂模式(Static Factory Method)是创建者模式的一种,是负责创建对象的模式。
模式的职责
工厂模式是为了实现创建对象和调用对象分离的需求。
简单工厂用来生产同一等级结构中的任意产品。(对于新增的产品需要修改已有代码)
工厂方法模式用来生产同意等级结构中的固定产品。(支持增加任意产品)
抽象工厂模式用来生产不同品种族的全部产品。(对于增加新的产品,无能为例,支持增加新的产品族)
为什么要创建和调用分离
当然是为了简化操作,为了封装型。为了把创建对象的逻辑和调用对象的逻辑分开来,对一些可能比较复杂的创建对象的操作进行封装,隔离复杂性,也保持封装性。工厂模式主要出于迪米特原则(最少知道原则)和开闭原则的考虑。
模式的实现
- 简单工厂模式
创建一个创建者对象(工厂Factory),在这个对象中封装创建对象的方法。至于对象的创建,可以通过接口来定义类的种类和一些必要的方法和参数,具体对象实现接口即可。
这样做完成了对创建和调用的分离。但是这个方法有一些不足:只能在工厂创建已知的对象创建的方法,如果需要扩展,就需要修改原有的代码,这样违反了开闭原则。
下面是一个简单的小例子,用来方便理解
//创建对象的抽象,可以抽象对象的必要方法和变量
public interface Car {
void run();
void stop();
}
public class BYD implements Car{
public void run() {
//奔跑方法的实现
}
public void stop() {
//停止方法的实现
}
}
public class FAWVolkswagen implements Car{
public void run() {
//奔跑方法的实现
}
public void stop() {
//停止方法的实现
}
}
//创建的工厂
public class SimpleFactory {
//创建实际对象的方法,具体创建方法由逻辑决定
public Car createBYD(){
Car c =new BYD();
return c;
}
//简单工厂将不同的对象创建方法放在同一个类当中
public Car createFAWVolkswagen(){
Car c =new FAWVolkswagen();
return c;
}
}
- 工厂模式
为每一个对象创建创建者对象(工厂Factory),在这个对象中封装创建对象的方法。至于对象的创建,可以通过接口来定义类的种类和一些必要的方法和参数,具体对象实现接口即可。
这样做完成了对创建和调用的分离,也可以在一定成都上扩展型更强。但是这个方法有一些不足:它会增加更多的类,需要更多的代码,对于代码的控制和管理不方便。
一个简单的例子方便理解
//创建对象的抽象,可以抽象对象的必要方法和变量
public interface Car {
void run();
void stop();
}
public class BYD implements Car{
public void run() {
//奔跑方法的实现
}
public void stop() {
//停止方法的实现
}
}
public class FAWVolkswagen implements Car{
public void run() {
//奔跑方法的实现
}
public void stop() {
//停止方法的实现
}
}
//BYD的创建工厂
public class BYDFactory {
//创建实际对象的方法,具体创建方法由逻辑决定
public Car createBYD(){
Car c =new BYD();
return c;
}
}
//FAWVolkswagen创建的工厂
public class FAWVolkswagenFactory {
//工厂将不同的对象创建方法放在不同的类当中
public Car createFAWVolkswagen(){
Car c =new FAWVolkswagen();
return c;
}
}
工厂模式和简单工厂模式的比较
- 结构复杂度
这个方面比较,简单工厂明显占优势,简单工厂只需要一个工厂类,而工厂模式的工厂数量会随着对象的个数而增多,这无疑会使类越来越多,结构就越来越复杂。 - 代码复杂度
代码复杂度和结构复杂度是一个矛盾,既然简单工厂模式在结构上比较简单,那么它在代码方面肯定比工厂方法复杂(需要在更少的类里面管理更多的信息)。 - 客户端编译难度
工厂方法虽然在工厂类的结构上引入结构中满足了开闭原则(OCP),但是在客户端编码的时候需要对相应的工厂实例化。而简单工厂只需要实例化一个整体的工厂就足够了。 - 管理上的难度
这个是关键的问题。
工厂方法的优势在于扩展性更好,但是简单工厂方式也不是没有可扩展性,只是需要修改相应的代码。虽然这样不满足开闭原则,但是设计原则是为了方便管理,而不是绝对的束缚。
然后就是可维护性,如果工厂的创建方法需要进行修改,简单工厂只需要修改一个类的相关代码,工厂模式则可能需要修改很多类的相关代码,操作会变得相当繁琐和麻烦。
所以,根据设计理论建议:工厂方法模式,但是在实际中一般会使用简单工厂模式。