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模式的主要内容,如果未能解决你的问题,请参考以下文章