23种设计模式(四) —— 手写实现 Factory Method 模式 (将具体交给子类)

2021-12-08 20:23:53 浏览数 (2)

四、Factory Method 模式

  • 一、Factory Method 模式(将生成的实例交给子类)
  • 二、示例程序
    • 2.1 框架类 (framework包下的)
    • 2.2 idCard
    • 2.3 main
    • 2.4 演示效果
  • 三、原文链接查看以及源代码

Author: Gorit

Date:2021年1月

Refer:《图解设计模式》

2021年发表博文: 13/50

一、Factory Method 模式(将生成的实例交给子类)

该模式用于生成实例,Factory 是工厂,用 Template Method 模式来构建生成实例的工厂。

在这个模式中,父类决定实例的生成方式,但并不决定索要生成的具体的类,具体的处理全部交给子类来负责。

这样就可以将生成实例的框架(framework)和实际负责生成实例的类解耦

二、示例程序

这个示例程序的功能是制作身份证(ID卡),它其中有 5个类

类称

功能

Product

只定义抽象方法 use 的抽象类

Factory

实现了 create() 方法的抽象类

IDCard

实现了 use() 方法的类

IDCardFactory

实现了 createProduct、registerProduct 方法的类

Main

测试程序行为的类

2.1 框架类 (framework包下的)

Product

代码语言:javascript复制
package Factory.framework;

/**
 * 声明产品的类,仅声明 use 方法,方法的实现交给子类负责
 * 定义产品 ”任意是可以 use 的“
 */
public abstract class Product {
    public abstract void use();
}

Factory

代码语言:javascript复制
package Factory.framework;

/**
 * 我们使用 Template Method 模式
 * 声明:
 *  1. 用于生成产品的 createProduct 抽象方法
 *  2. 用于注册产品的 registerProduct 抽象方法
 *  具体实现内容根据 Factory Method 适用的场景不同而不同,具体生成示例的时候一定会使用到 Template Method 模式
 */
public abstract class Factory {
    public final Product create(String owner) {
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
    }

    protected abstract void registerProduct(Product p);

    protected abstract Product createProduct(String owner);
}

2.2 idCard

IDCard

代码语言:javascript复制
package Factory.idcard;

import Factory.framework.*;

/**
 * 负责加工处理
 */
public class IDCard extends Product{
    private String owner;

    public IDCard(String owner) {
        System.out.println("制作" owner  "的 ID 卡");
        this.owner = owner;
    }

    public void use() {
        System.out.println("使用"   owner   "的 ID 卡");
    }

    public String getOwner() {
        return owner;
    }
}

IDCardFactory

代码语言:javascript复制
package Factory.idcard;

import Factory.framework.Factory;
import Factory.framework.Product;

import java.util.*;

/**
 * 实现了
 *  1. createProduct() 通过 IDCard
 *  2. reigisterProduct() 方法
 */
public class IDCardFactory extends Factory {
    private List owners = new ArrayList();
    protected Product createProduct(String owner) {
        return new IDCard(owner);
    }

    protected void registerProduct(Product p) {
        owners.add(((IDCard)p).getOwner());

    }

    public List getOwners() {
        return owners;
    }
}

2.3 main

代码语言:javascript复制
package Factory;

import Factory.framework.Factory;
import Factory.framework.Product;
import Factory.idcard.IDCardFactory;

public class Main {
    public static void main(String[] args) {
        Factory factory = new IDCardFactory();
        Product card1 = factory.create("小明");
        Product card2 = factory.create("小张");
        card1.use();
        card2.use();
    }
}

2.4 演示效果

三、原文链接查看以及源代码

原文链接 —— 以及其他系列文章整合 源代码

0 人点赞