工厂方法(Factory Method)设计模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38737992/article/details/89406027

1. 概述

Template Method设计模式来构建生成实例的工厂就是工厂方法(Factory Method)设计模式。

在工厂方法(Factory Method)设计模式,父类决定实例的生成方式,但不决定要生成的具体的类,具体的处理全部交给子类负责,这样就可以将生成实例的框架(framework)和负责生成实例的类解耦。

2. 代码实现

首先要创建两个包,一个framework包,framework包中有工厂类、物品类,这两个类组成了生成实例的框架。

一个具体包,里面一个具体物品工厂类、具体物品类。

这里用铅笔来作为具体物品。

工厂类 Factory.java ,create() 方法生成实例,具体的处理由createProduct(String owner)、registerProduct(Product product)这两个方法,这两个方法由子类负责:

package factoryMethod.framework;

public abstract class Factory {
    public final Product create(String owner) {
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
    }
    protected abstract Product createProduct(String owner);
    protected abstract void registerProduct(Product product);
}

物品类,Product.java :

package factoryMethod.framework;

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

具体物品工厂类PencilFactory.java,继承Factory.java:

package factoryMethod.pencil;

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

import java.util.ArrayList;
import java.util.List;

public class PencilFactory extends Factory {
    private List owners = new ArrayList();

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

    @Override
    protected void registerProduct(Product product) {
        owners.add(((Pencil)product).getOwner());
    }
}

具体物品类,Pencil.java:

package factoryMethod.pencil;

import factoryMethod.framework.Product;

public class Pencil extends Product {
    private String owner;
    Pencil(String owner) {
        System.out.println("制作" + owner + "的pencil");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println("使用" + owner + "的pencil");
    }

    public String getOwner() {
        return owner;
    }
}

测试类,test.java :

package factoryMethod;

import factoryMethod.framework.Factory;
import factoryMethod.framework.Product;
import factoryMethod.pencil.PencilFactory;

public class test {
    public static void main(String args[]) {
        Factory factory = new PencilFactory();
        Product p1 = factory.create("aaa");
        Product p2 = factory.create("bbb");
        Product p3 = factory.create("ccc");
        p1.use();
        p2.use();
        p3.use();
    }
}

运行截图如下所示:

参考文献:

  • 图解设计模式 - 结成浩著、杨文轩译 - 人民邮电出版社

猜你喜欢

转载自blog.csdn.net/qq_38737992/article/details/89406027