工厂方法模式定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
类图:
Product
负责定义产品的共性,实现对事件最的最抽象的定义,Creator
为抽象创建类,也就是抽象工厂,具体的创建由实现工厂ConcreteCreatetor
完成。
一个通用方式
抽象工厂类:AbstractProductFactory
package com.laolang.dp.factory;public abstract class AbstractProductFactory { /** * 创建一个产品对象 * @param t 创建参数 * @param创建的产品 * @return */ public abstract T createProduct ( Class t );}
工厂实现类:ProductFactory
package com.laolang.dp.factory;public class ProductFactory extends AbstractProductFactory { @Override publicT createProduct(Class t) { AbstractProduct product = null; try { product = (AbstractProduct) Class.forName(t.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return (T)product; }}
抽象产品类:AbstractProduct
package com.laolang.dp.factory;public abstract class AbstractProduct { // 产品类的公共方法 public void methodOne(){} // 抽象方法 public abstract void methodTwo();}
产品实现类:ConcreteProductOne
package com.laolang.dp.factory;public class ConcreteProductOne extends AbstractProduct{ @Override public void methodTwo() { System.out.println("产品一"); }}
使用
package com.laolang.dp.factory;import org.junit.Test;public class FactoryTest { @Test public void testOne(){ ProductFactory productFactory = new ProductFactory(); ConcreteProductOne productOne = productFactory.createProduct(ConcreteProductOne.class); ConcreteProductTwo productTwo = productFactory.createProduct(ConcreteProductTwo.class); }}
优点
-
良好的封装性
-
良好的扩展性
-
屏蔽产品类的具体实现
-
解耦
使用场景
- 客户端不知道它要创建的具体是哪一个子类。
- 一个类想要由自己的子类来定义某对象的创建过程。
- 类将创建某对象的职责代理给一些帮助子类中的一个,并且你想要将哪一个子类作为代理的信息进行局部化。
最佳实践
熟能生巧