GOF设计模式——Factory Method模式

一、什么是Factory Method模式

        Factory Method模式是用来构建生成实例的工厂,在该模式下,父类决定实例生成的方式,但并不决定所要生成的具体类。这样的设计思想,就跟Template Method模式相似(具体参考:https://www.cnblogs.com/SysoCjs/p/10327088.html或者https://blog.csdn.net/weixin_39400271/article/details/86565016),因为Factory Method模式就是建立在Template Method模式的基础上,前者是决定实例的生成方式,而后者则是决定方法的执行流程。

二、Factory Method模式思想

Product:一个抽象类,属于框架的一部分。里面定义了在Factory Method模式下生成的实现所拥有的接口(API);

Creator:负责生成Product角色的抽象类,也是属于框架的一部分;

ConcreteProduct:决定了具体的产品;

ConcreteCreator:负责生成具体的产品类。

三、具体例子

        假设要设计一个IDCard的工厂类,用来“制造”很多很多的IDCard。

1、Factory类

package com.cjs.factoryMethod;
 
public abstract class Factory {
    public final Product create(String owner) {
        Product product = createProduct(owner);
        registerProduct(product);
        return product;
    }
 
//Factory类只知道下面两个方法的作用,至于它们是怎么做的,Factory类不知道,也不关心,具体实现交给相应的子类
    protected abstract Product createProduct(String owner);//调用此方法,生成产品(类对象)
 
    protected abstract void registerProduct(Product product);//调用此方法,注册产品(类对象)
}

Factory抽象类定义了两个抽象方法:createProduct和registerProduct,分别用于创建产品和注册产品;另外,还定义了一个final修饰的方法,里面设定了一些处理流程,这也就是Template Method模式的设计思想。

扫描二维码关注公众号,回复: 5091402 查看本文章

2、Product类

package com.cjs.factoryMethod;
 
public abstract class Product {
    public abstract void use();
}

3、IDCardFactory类

package com.cjs.factoryMethod;
 
import java.util.*;
 
public class IDCardFactory extends Factory {
    private List owners = new ArrayList();
    @Override
    protected Product createProduct(String owner) {
        return new IDCard(owner);
    }
 
    @Override
    protected void registerProduct(Product product) {
        owners.add(((IDCard)product).getOwner());
    }
}

继承了Factory抽象类,实现了createProduct方法和registerProduct方法,换句话说,只要继承了Factory类,就具有“工厂”的制造功能。

4、IDCard类

package com.cjs.factoryMethod;
 
public class IDCard extends Product {
    private String owner;
 
    public IDCard(String owner) {
        System.out.println("制作 " + owner + " 的ID卡");
        this.owner = owner;
    }
 
    @Override
    public void use() {
        System.out.println("使用 " + owner + " 的ID卡");
    }
 
    public String getOwner() {
        return owner;
    }
}

5、Main类

package com.cjs.factoryMethod;
 
public class Main {
    public static void main(String[] args) {
        Factory factory = new IDCardFactory();
        IDCard idCard1 = (IDCard) factory.create("张三");
        IDCard idCard2 = (IDCard) factory.create("李四");
        IDCard idCard3 = (IDCard) factory.create("王五");
        idCard1.use();
        idCard2.use();
        idCard3.use();
    }
}

输出信息:

 

四、Factory Method模式的优点

        如果现在有一个新需求,要给每一个人制做一个工牌,那么,只要编写一个EmployeeCardFactory类,继承Factory类,并实现两个抽象方法,那么EmployeeCardFactory类就具有“工厂”的功能。请注意,这里并没有修改任何关于模板框架的内容,就可以创建出其他的“工厂”和“产品”。

猜你喜欢

转载自www.cnblogs.com/SysoCjs/p/10327165.html