序言
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。
简单工厂模式
定义:定义一个工厂类,它可以根据参数的不同返回不同的类实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂方法,它属于创建型模式。
在简单工厂模式有三个基本角色:
- Product(抽象的产品角色): 它是工厂类所创建对象的父类,封装了所有产品对象共有的方法。
- ConcreteProduct(具体产品角色): 继承抽象产品角色,它是简单工厂模式所创建目标,工厂类返回的对象都是该某一具体产品角色。
- Factory (工厂角色) : 是简单工厂模式的核心,它负责实现创建所有具体产品的实例的内部逻辑,工厂类可以被外界直接调用,创建所需的产品对象。
代码实现:
抽象产品角色:
/**
* @program
* @Desc 抽象产品
* @Author 游戏人日常
* @CreateTime 2019/07/12--15:29
*/
public abstract class Product {
}
具体产品角色:
/**
* @program
* @Desc 具体产品A
* @Author 游戏人日常
* @CreateTime 2019/07/12--15:29
*/
public class ConcreteProductA extends Product {
}
/**
* @program
* @Desc 具体产品B
* @Author 游戏人日常
* @CreateTime 2019/07/12--15:31
*/
public class ConcreteProductB extends Product {
}
工厂角色:
/**
* @program
* @Desc
* @Author 游戏人日常
* @CreateTime 2019/07/12--15:31
*/
public class Factory {
public Product factoryMethod(String type){
Product product=null;
switch (type){
case "A" :
product=new ConcreteProductA();
break;
case "B" :
product=new ConcreteProductB();
break;
//等等
}
return product;
}
}
客户端测试:
/**
* @program
* @Desc
* @Author 游戏人日常
* @CreateTime 2019/07/12--16:26
*/
public class Test {
public static void main(String[] args) {
//调用工厂类的静态方法, 根据参数A来获取ConcreteProductA对象
Product productA= Factory.factoryMethod("A");
//获取ConcreteProductB对象
Product productB= Factory.factoryMethod("B");
}
}
我们可以看到当客户端想要哪个具体产品对象时,只要通过工厂类调用工厂方法,根据传的参数不同来获取相应的产品对象,无需知道其创建的细节。
简单工厂模式的简化
在某些时候,为了简化工厂模式,我们可以将抽象产品类和工厂类合并,即 把工厂类的中的工厂方法移至到抽象产品类中。
在UML类图中,客户端可以通过具体产品父类的静态工厂方法创建,根据不同的参数来创建不同的产品子类的对象。
总结
- 简单工厂模式也称为静态工厂模式,它属于类创建型模式。 根据参数的不同返回不同类的实例。
- 简单工厂模式提供一个工厂类用于创建对象,工厂类中的工厂方法一般是静态方法。
- 有时简化后的简单工厂模式会把工厂类中工厂方法移至到抽象产品类中。
简单工厂模式优缺点:
优点
- 将对象的创建与使用分离,将对象的创建交给工厂类负责。
- 客户端无需知道所创建的具体产品类的类名,只要知道具体产品类所对应的参数即可,然后通过工厂类获取。
缺点
- 工厂类集中了所有产品的创建逻辑,职责过重,一旦有问题会导致整个系统受影响。
- 如果引入新的具体产品,就会导致去修改工厂类的逻辑,不符合“开闭原则”。
适用场景
- 工厂类所创建的对象比较少。
- 客户端只知道传入工厂类中工厂方法中的参数,对于如何创建对象并不关心。
欢迎关注我的公众号:游戏人日常
一个游戏技术人,分享Java、Python、H5、Android 等知识。同时会分享游戏行业日常。