【笔记整理】图解设计模式 | 第4章 Factory Method模式(将实例的生成交给子类)

【笔记整理】图解设计模式 | 导航


定义

  • 使用Template Method模式用于生成实例,就演变为Factory Method模式。

Factory Method模式中的登场角色

  • Product(产品)
  • Creator(创建者)
  • ConcreteProduct(具体的产品)
  • ConcreteCreator(具体的创建者)

Factory Method模式的类图


拓展思路的要点

  • 框架与具体加工。工厂和产品(框架)与具体工厂和具体产品(具体加工)在不同的包内。使用相同的框架就可以创建出其他的“产品”和“工厂”。框架不依赖于具体加工
  • 生成实例——方法的三种实现方式。这里指的是抽象工厂类中生成产品的create()方法:
  1. 指定其为抽象方法,具体工厂必须要实现该方法。
  2. 为其实现默认处理,但这时产品是用new关键字创建出来实例的,因此不能讲产品Product定义为抽象类。
  3. 在其中抛出异常,子类如果没有重写该方法,程序在运行时会出错。
  • 使用模式与开发人员之间的沟通。在使用设计模式设计类时,必须要向未来维护的开发人员正确传达设计的意图,可以添加详细注释。

相关的设计模式

       Factory Method模式是Template Method的典型应用。

  • Singleton模式(第5章)

       在多数情况下我们都可以将Singleton模式用于扮演Creator角色(或是ConcreteCreator角色)的类。这是因为在程序中没有必要存在多个Creator角色(或是ConcreteCreator角色)的实例

  • Composite模式(第11章)

       有时可以将Composite模式用于Product角色(或是ConcreteProduct角色)。

       有时,在Iterator模式中使用iterator方法生成Iterator的实例时会使用Factory Method模式。


代码

  • Product(产品)
package framework;

public interface Product {

	void use();

	void setName(String name);
}
  • Creator(创建者)
package framework;

public abstract class Factory {

	public final Product create(String owner, String number) {
		// Template的典型应用
		Product p = createProduct(owner, number);
		registerProduct(p);
		return p;
	}

	protected abstract Product createProduct(String owner, String number);

	protected abstract void registerProduct(Product product);
}
  • ConcreteProduct(具体的产品)
package idcard;

import framework.Product;

public class IDCard implements Product {

	private String owner;
	private String number;

	IDCard(String owner, String number) {
		System.out.println("制作" + owner + "的ID卡,卡编号为" + number);
		this.owner = owner;
		this.number = number;
	}

	@Override
	public void use() {
		System.out.println("使用" + owner + "的ID卡,卡编号为" + number);
	}

	public String getOwner() {
		return owner;
	}

	public String getNumber() {
		return number;
	}

	@Override
	public void setName(String name) {
		// TODO
	}

}
  • ConcreteCreator(具体的创建者)
package idcard;

import java.util.HashMap;
import java.util.Map;

import framework.Factory;
import framework.Product;

public class IDCardFactory extends Factory {

	private Map<String, String> owners = new HashMap<String, String>();

	@Override
	protected Product createProduct(String owner, String number) {
		return new IDCard(owner, number);
	}

	@Override
	protected void registerProduct(Product product) {
		String owner = ((IDCard) product).getOwner();
		String number = ((IDCard) product).getNumber();
		owners.put(owner, number);
	}

	public Map<String, String> getOwners() {
		return owners;
	}

}
  • 调用者
import java.util.Map;

import framework.Factory;
import framework.Product;
import idcard.IDCardFactory;

public class Main {

	public static void main(String[] args) {
		Factory factory = new IDCardFactory();
		Product card1 = factory.create("小明", "1");
		Product card2 = factory.create("小红", "2");
		Product card3 = factory.create("小刚", "3");
		card1.use();
		card2.use();
		card3.use();

		if (factory instanceof IDCardFactory) {
			Map<String, String> owner = ((IDCardFactory) factory).getOwners();
			owner.forEach((n, m) -> {
				System.out.println(n + " " + m);
			});
		}
	}
}

注:博客中的图片来自网上。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值