java设计模式——FactoryMethod模式

模式概念

这是工厂模式中比较简单的一种,大致思想和上篇提到的《java设计模式——TemplateMethod模式》 比较像。首先我们看一个图,这个图来自《图解设计模式》一书响应章节:
这里写图片描述
图中,提供了一个生产鱼的模具,然后我们可以使用不同的材料生产颜色,质感不一样的鱼,这个图很好地解释了工厂方法模式。
在Template Method模式中,我们在父类中规定处理流程,在子类中实现具体的细节。如果我们将该模式用于实例的生成,那么它就是Factory Method模式了。
Factory就是工厂的意思,也就是规模化,标准化生产对象实例的地方。用Template Method模式来构建生成的工厂,这就是FactoryMethod模式。
在FactoryMethod模式中,父类决定实例的生成方式,但是不决定需要生成什么类型的实例,具体的处理全部交给子类来负责。这样就可以将生成实例的框架和需要实现的业务细节解耦。

举个例子

我们这里举一个生产id卡的例子,主要用于生产每个人的ID卡。一共有5个类:
AbstractProduct类和AbstractFactory类属于framework包,提供实例生成的框架。
IDCard类和IDCardFactory类是负责实际生产的类,他们在idcard的包下。
Main类是客户端类。
这里涉及的类图如下:
这里写图片描述
代码整体的包结构如下:
这里写图片描述
下面我们看下具体的实现。

AbstractProduct

/*************************************************************************
    > File Name: AbstractProduct.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Thu Mar 15 10:19:14 2018
 ************************************************************************/
package framework;

public abstract class AbstractProduct {
    public abstract void use();
}

AbstractFactory

/*************************************************************************
    > File Name: AbstractFactory.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Thu Mar 15 11:52:57 2018
 ************************************************************************/
package framework;

public abstract class AbstractFactory {
    public final AbstractProduct create(String owner) {
        AbstractProduct product = createProduct(owner);
        registerProduct(product);

        return product;
    }

    protected abstract AbstractProduct createProduct(String owner);
    protected abstract void registerProduct(AbstractProduct product);
}

IDCard

/*************************************************************************
    > File Name: IDCard.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Thu Mar 15 11:56:19 2018
 ************************************************************************/
package idcard;

import framework.*;

public class IDCard extends AbstractProduct {
    private String owner;

    IDCard(String owner) {
        System.out.println("Creating id card, owner: " + owner);
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println("Using id card, owner: " + owner);
    }

    public String getOwner() {
        return owner;
    }
}

IDCardFactory

/*************************************************************************
    > File Name: IDCardFactory.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Thu Mar 15 12:28:07 2018
 ************************************************************************/
package idcard;

import framework.*;
import java.util.List;
import java.util.ArrayList;

public class IDCardFactory extends AbstractFactory {
    private List<String> owners = new ArrayList<>();

    @Override
    protected AbstractProduct createProduct(String owner) {
        return new IDCard(owner);
    }

    @Override
    protected void registerProduct(AbstractProduct product) {
        owners.add(((IDCard) product).getOwner());
    }

    public List<String> getOwners() {
        return owners;
    }
}

Main

/*************************************************************************
    > File Name: Main.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Thu Mar 15 12:35:22 2018
 ************************************************************************/
import framework.*;
import idcard.*;

public class Main {
    public static void main(String[] argvs) {
        AbstractFactory factory = new IDCardFactory();
        AbstractProduct card1 = factory.create("Tom");
        AbstractProduct card2 = factory.create("Jack");
        AbstractProduct card3 = factory.create("Jimmy");

        card1.use();
        card2.use();
        card3.use();
    }
}

运行结果

这里写图片描述

模式角色

在FactoryMethod模式中涉及的角色如下图:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值