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: [email protected] 
 > 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: [email protected] > 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: [email protected] > 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: [email protected] > 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 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 getOwners() {
        return owners;
    }
}

Main

/*************************************************************************
 > File Name: Main.java
 > Author: CreateChance
 > Mail: [email protected] 
 > 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面向对象与模式)