Java设计模式之FactoryMethod

一、简介

Factory意思为“工厂”,使用上一篇文章介绍的Template Method 模式来构建生成实例的工厂,这就是本文的主角FactroyMethod。

在Factory Method模式中,父类决定实例的生成方式,但并不所要生产的具体类,具体的类全部交给子类负责。

二、工厂模式的类图逻辑

1、所需的类

  • Factory :抽象类,定义生成产品的方法,以及使用Template Method的业务逻辑
public abstract class Factory {

    public Product create(String name) {
        Product product = createProduct(name);
        registerProduct(product);
        return product;

    }
    abstract Product createProduct(String name);
    abstract void registerProduct(Product product);
}
  • Product:抽象类,定义生成的产品类
public abstract class Product {

    private  long cardNumber;
    public Product() {
        this.cardNumber = System.currentTimeMillis();
    }
    public long getCardNumber() {
        return cardNumber;
    }
   public abstract void use();
}
  • FactoryImpl :具体的工厂类,实现创建和相应的抽象方法
package com.example.administrator.googleplay.bar;

import java.util.ArrayList;

/**
 * Created by wuliangliang on 2018/5/6.
 */

public class IDFactory extends Factory {

   private ArrayList<Product> productArrayList = new ArrayList<>();

    @Override
    Product createProduct(String name) {
        return new IDCard(name);
    }

    @Override
    void registerProduct(Product product) {
        productArrayList.add(product);
    }

    public ArrayList<Product> getProductArrayList() {
        return productArrayList;
    }
}
  • ProductImpl :商品的具体类,实现商品类以及产品相应的执行方法
package com.example.administrator.googleplay.bar;

import android.util.Log;

/**
 * Created by wuliangliang on 2018/5/6.
 */

public class IDCard extends Product {

    String name;

    public IDCard(String name) {
        this.name = name;
    }

    @Override
    public void use() {
        Log.e("=====",name+"使用了身份证! 身份证号为:" +getCardNumber());
    }
}

2、登场角色

  • Product (产品)

抽象类,定义了Factory Method 模式中生成的实例的API,但具体的处理则由其子类ConcreteProduct角色决定。在示例中由Product扮演。

  • Creator (创建者)

creator属于框架的一方,它负责生成Product角色的抽象类,但具体的处理则由其子类ConcreteCreator角色决定。在实例中由Fractory扮演,

  • ConcreteProduct (具体产品)

ConcreteProduct属于具体的实现一方,它决定了具体产品。在实例中由IDCard扮演;

  • ConcreteCreator  (具体的创建者)

ConcreteCreator 属于具体的实现一方,它负责创建具体的产品,在实例中由IDFactory扮演;

3、使用示例

   //创建工厂对象
        Factory factory = new IDFactory();
        // 生成具体的产品类
        Product idCardA = factory.create("AAA");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Product idCardB = factory.create("BBB");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Product idCardC = factory.create("CCC");

        //调用执行的方法
        idCardA.use();
        idCardB.use();
        idCardC.use();

输出结果:

05-06 14:23:31.008 20669-20669/com.example.administrator.googleplay E/=====: AAA使用了身份证! 身份证号为:1525616607003
05-06 14:23:31.008 20669-20669/com.example.administrator.googleplay E/=====: BBB使用了身份证! 身份证号为:1525616609004
05-06 14:23:31.008 20669-20669/com.example.administrator.googleplay E/=====: CCC使用了身份证! 身份证号为:1525616611008

三、思路拓展

将工厂模式和产品抽象类,按照具体的业务逻辑封装成模块后,以后无论创建不同 的产品,只需实现具体的抽象类实现方法即可。


猜你喜欢

转载自blog.csdn.net/alexwll/article/details/80219432