java设计模式——FactoryMethod模式

Posted createchance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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模式中涉及的角色如下图:

以上是关于java设计模式——FactoryMethod模式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA设计模式

JAVA23种设计模式

Java学习笔记——设计模式之五.工厂方法

4.工厂方法模式-factoryMethod

创建型模式都有哪些

设计者模式 -- 工厂方法(FactoryMethod)