简单工厂模式是最广泛被使用的一个模式,伟大的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中是使用了文件的方式。