`
gengu
  • 浏览: 85092 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

工厂方法模式

阅读更多

简单工厂模式是最广泛被使用的一个模式,伟大的Spring就大量使用了它的思想

 

那么为什么要使用工厂模式呢?

首先,良好的封装性,代码结构清晰,对用户屏蔽了类实体的创建过程

其次,良好的可扩展性,在增加产品类的情况下,只要适当的修改具体工厂类或者扩展一个工厂类,就可以"拥抱变化"。

再次,屏蔽产品类,产品类如何变化,调用者根本不用担心,它只关心产品的接口,只要接口保持不变,系统的上层模块就不用变化,因为产品的实例化工作是工厂去完成的。

 

产品接口

package com.gengu.工厂方法;

/** 这是一个产品接口*/
public interface Product {
	public void doSomething();
}

 产品A

package com.gengu.工厂方法;
/**
 * 产品A
 * */
public class ProductA implements Product{

	private ProductA(){}
	@Override
	public void doSomething() {
		System.out.println("====这是产品A====");
	}
}

产品B

package com.gengu.工厂方法;

public class ProductB implements Product{
	private ProductB(){}
	@Override
	public void doSomething() {
		System.out.println("====这是产品B====");
	}
}

 工厂接口

package com.gengu.工厂方法;

/**这里是工厂类*/
public interface Creater {
	/**
	 * 这里返回我需要的实体
	 * */
	public <T extends Product>  T createProduct(Class<T> clazz);
}

 工厂类

package com.gengu.工厂方法;

public class CreaterFactory implements Creater{
	@SuppressWarnings("unchecked")
	@Override
	public <T extends Product> T createProduct(Class<T> clazz) {
		Product product = null;
		try{
			product = (Product)Class.forName(clazz.getName()).newInstance();
		}catch(Exception e){
			e.printStackTrace();
		}
		return (T) product;
	}
}

 测试类

package com.gengu.工厂方法;
/**
 * 测试类
 * */
public class Client {
	public static void main(String[] args) {
		Creater creater = new CreaterFactory();
		ProductA productA = creater.createProduct(ProductA.class);
		productA.doSomething();
	}
}

 以上就是简单工厂方法的一个范例,工厂方法模式的可扩展性比简单工厂的更优秀,因为他使用了不同于简单工厂的类加载来创建实体,这也是Spring种使用的一种创建bean的方法,只是在工厂方法模式中是在代码中指定,而Spring中是使用了文件的方式。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics