Java设计模式—-工厂模式
发表于更新于
字数总计:564阅读时长:2分钟 上海
后端后端Java设计模式—-工厂模式
xukun在工厂模式中,父类决定实例生成的具体方式,但是决定不了具体生成的类,具体的处理全部交给子类负责,类似于模板模式。
1.1 定义Product抽象类
Product类来表示产品,这个类中只声明了抽象方法use()等待子类重写。
1 2 3 4 5 6 7 8
|
public abstract class Product { public abstract void use(); }
|
1.2 定义Factory抽象类
Factory类使用了模板模式,本类定义了抽象方法 creatProduct 和 registerProduct,定义并实现了 create 方法,通过调用这个方法实现产品的注册。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public abstract class Factory { public Product create(String owner) { Product p = createProduct(owner); registerProduct(p); return p; } protected abstract Product createProduct(String owner); protected abstract void registerProduct(Product product); }
|
1.3 定义IDCard类
继承了 Product 类并实现了 use() 方法,构造器初始化了属性 owner 和 idNum,并输出语句进行提示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
public class IDCard extends Product { private String owner; private int idNum;
IDCard(String owner, int idNum) { System.out.println("制作" + owner + "(" + idNum + ")" + "的ID卡..."); this.owner = owner; this.idNum = idNum; }
@Override public void use() { System.out.println("使用" + owner + "(" + idNum + ")" + "的ID卡..."); }
public String getOwner() { return owner; } }
|
1.4 定义IDCardFactory类
这个类继承了 Factory 并实现了其两个抽象方法,creatProduct 方法通过生成 IDCard 的实例来生成产品,registerProduct 通过将 IDCard 的 owner 保存到 List 数组中实现注册产品。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
@SuppressWarnings("all") public class IDCardFactory extends Factory {
private List<String> owners = new ArrayList<>(); private int idNum = 1001;
@Override protected Product createProduct(String owner) { return new IDCard(owner, idNum++); }
@Override protected void registerProduct(Product product) { owners.add(((IDCard) product).getOwner()); } }
|
1.5 测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
public class RunMain { public static void main(String[] args) { Factory factory = new IDCardFactory(); Product card1 = factory.create("小明"); Product card2 = factory.create("小红"); Product card3 = factory.create("小刚"); rd1.use(); card2.use(); card3.use(); } }
|
1.6 运行结果

1.7 总结
具体的实现内容根据工厂模式适用场景不同而变化,但是只要是工厂模式,在生成实例时就一定会用到模板模式。