平时所说的工厂模式,分为简单工厂模式、工厂方法模式和抽象工厂模式,属于设计模式中的创建型模式。
创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。——摘自百度百科
工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。——摘自C语言中文网
本想通过定义来进一步理解工厂模式,但看到这个定义之后感觉…,可能理科+计算机+男同志更适合采用图和代码的方式理解知识吧,所以后面我还是通过UML类图和代码来梳理和总结这个工厂模式。
一,简单工厂模式
工厂模式中的类分为四种,父类接口、子类、工厂类和客户程序
下面,简单工厂模式的代码实现:
以上是简单工厂模式的UML类图和代码实现。基本内容大概就是,在消费者(Consumer)消费的时候,不必通过Car car = new BWM();
创建每个对象,而是通过向工厂类中传相应的type,在工厂类中创建需要的类的对象。
即是,定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。(上面的定义)
由UML类图的绿色部分可知,(工厂类CarFactory是必经之路!)当需要添加其他的类时(比如图中的Dazhong),只需要创建一个实现了Car接口的对象类,并在工厂类(CarFactory)中,加入代码else if(type = 3){...}
。
缺点:
新增产品时要修改工厂类,不满足开-闭原则。
二,工厂方法模式
因为普通工厂模式不满足开闭原则,在新增其他子类时需要修改工厂类,故引入工厂方法模式。
此模式中,新增了工厂接口,创建具体产品实例的工作延迟到其工厂子类去完成。
由以上UML类图绿色部分可知,当系统需要新增一个产品时,无需修改现有的代码,只需添加一个具体产品的类和其对应的工厂子类,满足开闭原则。
缺点:
代码多,一个产品对应一个工厂,当添加一个产品时就需要添加两个类。复杂。
三,使用反射优化简单工厂模式
简单工厂模式不满足开闭原则,在这里通过反射进行优化。
优化之后UML的结构没有改变,父类和子类的代码都没有改变!
其中变化的,工厂类
package simpleFactoryFanshe;
public class CarFactory {
public static Car makeCar(String type)//type是类型全名,包名.类名
{
Class<?> cls = null;
Car car = null;
try {
//获取类的类对象
cls = Class.forName(type);
//创建类的对象
car = (Car)cls.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return car;
}
}
消费者使用时,
package simpleFactoryFanshe;
import java.util.Scanner;
public class Consumer {
public static void main(String[] args) {
System.out.println("输入要创建的车型,1宝马,2凯迪拉克:");
Scanner reader = new Scanner(System.in);
int number = reader.nextInt();
if(number == 1)
{
Car car = CarFactory.makeCar("simpleFactoryFanshe.BMW");
car.showName();
}
else if(number == 2)
{
Car car = CarFactory.makeCar("simpleFactoryFanshe.Cadillac");
car.showName();
}
}
}
这时,新增一个产品时不在需要修改原来的代码!
进一步优化:如果,将simpleFactoryFanShe.BWM等保存在配置文件中,便可在新增类时直接增加对应产品类,和修改配置文件,甚至对客户程序都不用修改!
package simpleFactoryFanshe;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;
import java.util.Scanner;
public class Consumer {
public static void main(String[] args) {
System.out.println("输入要创建的车型,1宝马,2凯迪拉克:");
Scanner reader = new Scanner(System.in);
String number = reader.next();
//读取配置文件
Properties pros = new Properties();
try {
FileInputStream fis = new FileInputStream("src\\carType.properties");
pros.load(fis);
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
Car car = CarFactory.makeCar(pros.getProperty(number));
car.showName();
}
}
配置文件如下:
当需要添加新的产品时,只需要在配置文件中添加一行信息!既没有工厂方法模式的代码复杂性,又满足开闭原则!
总感觉抽象工厂模式对于简单工厂模式和工厂方法模式来说有比较大的改变,先不在此总结。
到这里,对三种形式的工厂模式有了大概的总结,按照常理在此应该有一些应用场景的总结或一些更高级的应用,但由于我没有较多的开发经验,所以我觉得自己需要有一定的了解和应用之后才能更好的总结,(以后会多阅读资料和编程应用该模式)。
关于工厂模式,目前就了解这么多吧,对于更高级的内容,我有待进一步学习。以上内容是我个人在学习之后的梳理和总结,旨在使所学的内容更加清晰和方面后续复习,故请不勿喷语言表达不清和逻辑结构不清的地方,但虚心接受大家的交流和指导,如果本文能对大家的学习起到帮助,我深感荣幸!