本人所学设计模式皆出自于 结城浩先生的《图解设计模式》。
类图
为什么使用工厂模式
在工厂模式中,父类决定实例生成的方式,但不决定所要生成的具体类,具体的处理全部交给子类。这样就可以将生成实例的框架和实际负责生成实例的类解耦。
示例代码
package com.qiang.framework;
/**
* 抽象工厂
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public abstract class Factory {
/**
* 模板模式调用 用来常见一个产品,并且加入工厂记录
*
* @param owner 根据自己所需随意增加参数
* @return 创建的产品
*/
public final Product create(String owner) {
Product product = createProduct(owner);
registerProduct(product);
return product;
}
/**
* 创建商品的抽象方法
*
* @param owner 根据自己所需随意增加参数
* @return 产品
*/
protected abstract Product createProduct(String owner);
/**
* 注册商品的抽象方法
*
* @param product 当前创建的产品
*/
protected abstract void registerProduct(Product product);
}
package com.qiang.framework;
/**
* 抽象产品
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public abstract class Product {
/**
* 产品应有的共性功能
*/
public abstract void use();
}
package com.qiang.factory;
import com.qiang.framework.Product;
/**
* 产品-身份证
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public class IdCard extends Product {
private String owner;
public IdCard(String owner) {
System.out.println("正在生产:" + owner + " 的身份证");
this.owner = owner;
}
@Override
public void use() {
System.out.println(owner + "的身份证正在被使用");
}
public String getOwner() {
return owner;
}
}
package com.qiang.factory;
import com.qiang.framework.Factory;
import com.qiang.framework.Product;
import java.util.ArrayList;
import java.util.List;
/**
* 用来生产身份证的工厂
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public class IdCardFactory extends Factory {
private List<IdCard> owner = new ArrayList<>();
@Override
protected Product createProduct(String owner) {
return new IdCard(owner);
}
@Override
protected void registerProduct(Product product) {
owner.add((IdCard) product);
}
}
package com.qiang;
import com.qiang.factory.IdCardFactory;
import com.qiang.framework.Factory;
import com.qiang.framework.Product;
/**
* 测试类
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public class Test {
public static void main(String[] args) {
Factory idCardFactory = new IdCardFactory();
Product product = idCardFactory.create("张三");
product.use();
Product lisi = idCardFactory.create("李四");
lisi.use();
}
}
结果
正在生产:张三 的身份证
张三的身份证正在被使用
正在生产:李四 的身份证
李四的身份证正在被使用