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