目录
一、简介
简单工厂模式(Simple Factory Pattern):属于创建型模式,又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。
- 简单工厂模式专门定义一个类(SimpleFactory工厂类)来负责创建其他类的实例,被创建的实例通常都具有共同的抽象父类。
- 简单工厂只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其实现过程(使用者可直接消费产品而不需要知道其生产的细节)
- 简单工厂模式不属于GoF四人组提出的23种设计模式,它是最简单的工厂模式。
二、模式原理
2.1模式组成
组成(角色) | 作用 |
---|---|
Product(抽象产品类) | 抽象产品类,简单工厂模式所创建的所有对象的父类,是ConcreteProduct类的父类 |
ConcreteProduct(具体产品类) | 具体产品类,可以有多个,都要继承Product类 |
SimpleFactory(工厂类) | 工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。 工厂类的创建产品类的方法可以被外界直接调用,创建所需的具体对象。 |
2.2 UML类图
- ConcreteProduct具体产品类继承Product抽象类
- SimpleFactory工厂类可以创建不同的实例对象
- 不同的Store类通过依赖SimpleFactory工厂类,与ConcreteProduct类不直接依赖
三、实例
3.1 实例概况
- 背景:一家服装生产厂,用来生产不同的服装
- 目的:利用简单工厂模式实现3款不同服饰的生产
3.2 使用步骤
- 步骤一:创建抽象产品类
//服装生产厂
//抽象父类
public abstract class GarmentFactory {
public abstract void show(); //抽象函数
}
- 步骤二:创建不同的服装类(继承抽象产品类)
//具体产品类:长裙
public class Longskirt extends GarmentFactory{
public void show(){
System.out.println("生产出了长裙");
}
}
//具体产品类:短裙
public class Shortskirt extends GarmentFactory{
public void show(){
System.out.println("生产出了短裙");
}
}
//具体产品类:吊带裤
public class Suspenders extends GarmentFactory {
public void show(){
System.out.println("生产出了吊带裤");
}
}
- 步骤三:创建工厂类,根据传入的参数的不同,利用switch创建不同的具体产品类的实例
//工厂类
public class SimpleFactory {
public GarmentFactory createProduct(String productName){
//利用switch来控制生产不同的服装
//如果需要修改或增加新的服装,只需要在switch中增加一个case语句即可
switch(productName){
case "长裙":
return new Longskirt();
case "短裙":
return new Shortskirt();
case "吊带裤":
return new Suspenders();
default:
return null;
}
}
- 步骤四:外界调用工厂类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Store {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个工厂类
SimpleFactory simpleFactory = new SimpleFactory();
String clothName = getType();// 得到一个产品名称
try {
//创建了一个具体产品类
GarmentFactory product = simpleFactory.createProduct(clothName);
product.show();
} catch (NullPointerException e) {
System.out.println("没有这一类产品");
}
}
// 输入生产的产品名称
public static String getType() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input cloth 种类:");
String str = reader.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
3.3 UML类图
四、优缺点
4.1 优点
- 工厂类将创建产品的过程与使用产品的过程分开,能够让使用者不用关心如何创建产品对象,只需要消费产品即可。
- 通过对工厂类的增删改,可以保证在不修改任何客户端代码的情况下修改和增加新的具体产品类,在一定程度上提高了系统的灵活性。
4.2 缺点
- 由于工厂类集中了所有产品创建逻辑,一旦这个工厂不能正常工作,整个系统都要受到影响。
- 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,同样破坏了“开闭原则”;在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
- 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。
五、应用场景
- 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;
- 当工厂类负责创建的对象(具体产品)比较少时。