Java设计模式之—Factory Method模式(工厂模式)

Java设计模式之—Factory Method模式(工厂模式)

在Factory Method模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类。具体的处理全部交给子类负责。这样就可以将生成实例的框架(framework)和实际负责生成实例的类解耦。

应用场景

1、当一个类不知道它所需要的对象的类时
在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可;
2、当一个类希望通过其子类来指定创建对象时
在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
3、将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

Product抽象类
public abstract class Product {
	public abstract void use();
}
IDCard类(继承Product抽象类)
public class IDCard extends Product {
	private String owner;

	public IDCard(String owner) {
		System.out.println("制作" + owner + "的ID卡。");
		this.owner = owner;
	}

	@Override
	public void use() {
		System.out.println("使用" + owner + "的ID卡!");
	}

	public String getOwner() {
		return owner;
	}
}
Factory抽象类

定义了实例的生成方式,但并不确定要生成的具体的类(如下,Product是抽象类,并不是具体的类),具体的处理全部交给子类负责。
这样就可以将生成实例的框架和实际负责生成实例的类解耦。

public abstract class Factory {

	protected abstract Product createProduct(String owner);

	protected abstract void registerProduct(Product product);

	public final Product create(String owner) {
		Product product = createProduct(owner);
		registerProduct(product);
		return product;
	}
}
IDCardFactory类(继承Factory抽象类)

定义了实例的具体生成方式。

import java.util.ArrayList;
import java.util.List;

public class IDCardFactory extends Factory {
	private List owners = new ArrayList();

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

	@Override
	protected void registerProduct(Product product) {
		owners.add(((IDCard) product).getOwner());
	}

	public List getOwers() {
		return owners;
	}
}
Clienter类(测试类)
public class Clienter {
	public static void main(String[] args) {
		Factory factory = new IDCardFactory();
		Product card1 = factory.create("zhongyp");//制作zhongyp的ID卡。
		Product card2 = factory.create("z先生");//制作z先生的ID卡。
		Product card3 = factory.create("昵称");//制作昵称的ID卡。
		card1.use();//使用zhongyp的ID卡!
		card2.use();//使用z先生的ID卡!
		card3.use();//使用昵称的ID卡!
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值