简单工厂模式

传入参数,创建属于同一父类下的不同子类实例。

定义一个父类(通常是抽象的),再定义一些基于父类的具体子类,然后定义一个工厂类,包含了一个用于创建各个不同子类的静态方法,它根据传入的参数来判断应该创建那个子类实例。

简单工厂中,存在3个角色:

  • 抽象产品
  • 具体产品
  • 简单工厂

简单工厂下的角色划分

User抽象父类

package com.example.ezfactory.pojo;

import java.util.Arrays;

public abstract class User {
    String id;
    String name;
    int[] permissions;  // 权限数组: 1-查看,2-进入,3-管理,4-裁决

    public User(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", permissions=" + Arrays.toString(permissions) +
                '}';
    }
}

Client客户子类

package com.example.ezfactory.pojo;

import java.util.UUID;

public class Client extends User {

    public Client(String name) {
        super(name);
        this.id = "c-".concat(UUID.randomUUID().toString());	//id以'c-'开头
        this.permissions = new int[]{1};	//拥有权限1(查看)
    }
}

Employee员工子类

package com.example.ezfactory.pojo;

import java.util.UUID;

public class Employee extends User{

    public Employee(String name) {
        super(name);
        this.id = "e-".concat(UUID.randomUUID().toString());	//id以'e-'开头
        this.permissions = new int[]{1,2};	//拥有权限1(查看)和权限2(进入)
    }
}

还有Manager(管理)和Boss(老板)以此类推

UserFactory简单工厂类

定义了一个静态方法:传入2个参数,一个指定User的类型,一个指定User实例对象的名字,并生成相应的实例对象

package com.example.ezfactory;

import com.example.ezfactory.pojo.*;

public class UserFactory {

    public static User getUser(String type, String name){
        switch (type){
            case "client":{
                return new Client(name);
            }
            case "empolyee":{
                return new Employee(name);
            }
            case "manager":{
                return new Manager(name);
            }
            case "boss":{
                return new Boss(name);
            }
            default:{
                return null;
            }
        }
    }
}

测试

Main.java

package com.example.ezfactory;

import com.example.ezfactory.pojo.User;

public class Main {

    public static void main(String[] args) {
        User user = UserFactory.getUser("boss","老板");
	    System.out.println(user.toString());
    }
}

把"boss"换成其他试试。

简单工厂的优点

★ 实现了责任的分割
★ 客户端可以不用知道具体产品的类名,只需要掌握基本的参数就行

简单工厂的缺点

★ 工厂类出问题,整个模块受牵连
★ 需要维护很多子类
★ 由于是静态工厂方法,如果父类有静态方法,子类将无法覆盖静态方法

应用场景

客户不关系具体的对象类名和创建细节,只需要初始参数,并且所需要创建的类不太多。