一、简介
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
三、思路拓展
将工厂模式和产品抽象类,按照具体的业务逻辑封装成模块后,以后无论创建不同 的产品,只需实现具体的抽象类实现方法即可。