设计模式(1)--工厂方法模式

本文介绍了工厂方法模式,通过抽象工厂类解决简单工厂模式扩展性不足的问题。具体实现中,每种产品都有对应的工厂类,通过配置文件指定具体工厂,利用反射技术创建实例。

上一篇简单工厂模式,如果扩展新的产品类,需要修改工厂类源代码,不符合开闭原则,工厂方法模式通过对工厂类进行抽象,很好的解决了这个问题。


工厂方法模式UML类图如图所示:


说明:具体产品继承抽象产品,具体工厂继承抽象工厂,具体工厂依赖具体产品。


具体实例代码如下所示(其实是在简单工厂模式实例代码的基础上对工厂类进行了一下抽象):

抽象工厂类:

public abstract class AbstractFactory {

	public abstract Product getProduct();
}

具体产品A工厂类:

ublic class ProductAFactory extends AbstractFactory{

	@Override
	public Product getProduct() {
		// TODO Auto-generated method stub
		return new ProductA();
	}

}

具体产品B工厂类:

public class ProductBFactory extends AbstractFactory{

	@Override
	public Product getProduct() {
		// TODO Auto-generated method stub
		return new ProductB();
	}

}


抽象产品类:

public abstract class Product {

	//公共方法
	public void sameMethod(){
		System.out.println("我是公共方法!");
	}
	//定义抽象方法
	public abstract void diffMethod();
}

具体产品类A:


public class ProductA extends Product{

	@Override
	public void diffMethod() {
		System.out.println("A产品的方法!");
		
	}

}

具体产品类B:


public class ProductB extends Product{

	@Override
	public void diffMethod() {
		// TODO Auto-generated method stub
		System.out.println("B产品方法!");
	}

}


Main类:

public class Main {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		
		Class facrotyClazz = Class.forName(ReadProperties.readProperties("factory_name"));
		AbstractFactory factory = (AbstractFactory)facrotyClazz.newInstance();
		 
		Product product =factory.getProduct();
		product.sameMethod();	
		product.diffMethod();
	}

}

说明,Main类主方法利用反射技术从配置文件读取信息,生成工厂实例。


工厂方法模式说明:

工厂方法模式面向抽象的工厂类进行编程,将具体产品类的实例化延迟到工厂子类中完成,如果想修改生产的产品,修改配置文件中的具体工厂配置就可以,此模式,一个具体工厂类对应一个具体产品,如果生产新的产品C的话,完全不用修改源代码,只要添加一个ProductCFactory类和一个ProductC类就行,修改一下配置文件中的具体工厂类配置,就可以生产C产品。

该模式中属于运行期才确定new哪个对象,所以使用反射技术生成工厂类很容易达到目的。

该模式有一个缺点就是,如果扩展产品的话,还要扩展一个相对应的具体产品工厂,类的个数成对增加。


如有问题,欢迎指正

end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值