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