简单工厂模式又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等), 这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。
定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景
在任何需要生成复杂的对象的地方,都可以使用工厂方法模式。工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心。
模式结构
- 抽象产品类:工厂设计模式创建的产品的父类
- 具体产品类:为实现抽象产品的某个具体产品对象
- 抽象工厂类:工厂模式的核心
- 具体工厂类:实现了具体的业务逻辑
客户类
模式的简单实现
汽车厂要生产Q3、Q5、Q7三种汽车,这里汽车厂就是工厂(factory)、汽车就是产品(product)、生产线就是客户(client)
汽车的抽象接口:
public interface Car {
void drive();
//自动导航
void selfNavigation();
}
工厂接口:
通过反射的方式更加简洁的生产产品对象,需要在工厂生产方法中传入一个class类来决定是哪一种产品类。
public interface Factory {
<T extends Car> T createCar(Class<T> clz);
}
工厂具体:
对于具体的工厂类,通过反射获取类的示例即可。
public class CarFactory implements Factory {
@Override
public <T extends Car> T createCar(Class<T> clz) {
Car car = null;
try {
car = (Car) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) car;
}
}
具体的产品:
Q3:
public class Q3Car implements Car {
@Override
public void drive() {
System.out.println("Q3启动了");
}
@Override
public void selfNavigation() {
System.out.println("Q3自动导航");
}
}
Q5:
public class Q5Car implements Car {
@Override
public void drive() {
System.out.println("Q5启动了");
}
@Override
public void selfNavigation() {
System.out.println("Q5自动导航");
}
}
Q7:
public class Q7Car implements Car {
@Override
public void drive() {
System.out.println("Q7启动了");
}
@Override
public void selfNavigation() {
System.out.println("Q7自动导航");
}
}
生产线client
public class Client {
public static void main(String[] args) {
CarFactory factory = new CarFactory();
Q3Car q3Car = factory.createCar(Q3Car.class);
q3Car.drive();
q3Car.selfNavigation();
Q5Car q5Car = factory.createCar(Q5Car.class);
q5Car.drive();
q5Car.selfNavigation();
Q7Car q7Car = factory.createCar(Q7Car.class);
q7Car.selfNavigation();
q7Car.drive();
}
}
简单工厂的缺点
- 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
- 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
- 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。