简单工厂模式
简单工厂模式并不属于GoF 23个经典设计模式,设计思想相对简单,基本流程为:
将需要创建的各种不同对象(例如各种不同的Chart对象)的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象;客户端只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。
简单工厂模式定义如下:
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。
简单工厂模式结构图

avatar
简单工厂模式有如下几种角色
- Factory(工厂角色)
- Product(抽象产品角色)
- ConcreteProduct(具体产品角色)
在简单工厂模式中,客户端通过工厂类来创建一个产品类的实例,而无须直接使用new关键字来创建对象,它是工厂模式家族中最简单的一员。
简单工厂模式实例之权限管理

avataor
public abstract class User {
public void sameOperation(){
System.out.println("共同的权利");
}
public abstract void diffOperation();
}
public class Employee extends User {
@Override
public void diffOperation() {
System.out.println("Emplyee的特殊权利");
}
}
public class Manager extends User {
@Override
public void diffOperation() {
System.out.println("Manager的特殊权利");
}
}
public class Administrator extends User {
@Override
public void diffOperation() {
System.out.println("Administror的特殊权利");
}
}
public class UserFactory {
public static User getUser(int permission){
if(0==permission){
return new Employee();
}else if(1==permission){
return new Manager();
}else{
return new Administrator();
}
}
}
public static void main(String[] args){
User user=UserFactory.getUser(0);
user.sameOperation();
user.diffOperation();
User user1=UserFactory.getUser(1);
user1.sameOperation();
user1.diffOperation();
User user2=UserFactory.getUser(2);
user2.sameOperation();
user2.diffOperation();
}
----输出结果----
共同的权利
Emplyee的特殊权利
共同的权利
Manager的特殊权利
共同的权利
Administror的特殊权利
简单工厂模式的优点
- 工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离。
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以在一定程度减少使用者的记忆量。
- 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
简单工厂模式的缺点
- 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。
- 使用简单工厂模式势必会增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度。
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
- 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。