[23种设计模式][创建型]12.简单工厂模式

168 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

1.意图:

简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。通常它根据自变量的不同返回不同的类的实例。

2.适用性:

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。

3.简单工厂(Simple Factory)模式的构成:

  1. 工厂类(Creator)角色:担任这个角色的是简单工厂模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体类实现。
  2. 抽象产品(Product)角色:担任这个角色的类是简单工厂模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个接口或者抽象类实现。
  3. 具体产品(Concrete Product)角色:建党工厂模式所创建的人和对象都是这个角色的实例,具体产品角色由一个具体类实现。

4.简单工厂模式UML类图:

Image.png

5.简单工厂模式UML序列图:

Image.png

6.代码示例:

Image.png 抽象产品:

public abstract class SchoolUser {

    public String firstName;
    public String lastName;
    public String userType;

    public void show() {
        System.out.println("First Name: " + firstName);
        System.out.println("Last Name: " + lastName);
        System.out.println("User Type: " + userType);
    }
}

具体产品:

public class SchoolPrincipal extends SchoolUser {

    public SchoolPrincipal() {
        firstName = "David";
        lastName = "Smith";
        userType = "Principal";
    }
}

具体产品:

public class SchoolTeacher extends SchoolUser {

    public SchoolTeacher() {
        firstName = "Patrecia";
        lastName = "Terry";
        userType = "Teacher";
    }
}

工厂角色:

public class SimpleFactory {

    public static SchoolUser getSchoolUser(String user, String password) {
        if ("Principal" == user && "Principal" == password) {
            return new SchoolPrincipal();
        }

        if ("Teacher" == user && "Teacher" == password) {
            return new SchoolTeacher();
        }

        return null;
    }
}

客户角色:

public class Client {

    public static void main(String[] args) {

        SchoolUser user = null;

        // 简单工厂模式的核心
        user = SimpleFactory.getSchoolUser("Principal", "Principal");
        System.out.println("校长登录:");
        user.show();

        System.out.println("----------------");

        user = SimpleFactory.getSchoolUser("Teacher", "Teacher");
        System.out.println("教师登录:");
        user.show();
    }
}