工厂方法模式又称为多态性工厂,个人认为多态性工厂更能准确的表达这个模式的用处.与简单工厂(静态工厂)相比较,这里的多态性是指抽象出一个工厂基类,将因为一个产品有N种不同的是现这种变化封装起来,将具体的实例化延迟到了工厂类的子类中来实现.
谈谈耦合关系先
面向对象设计模式的学习重点应该是寻找业务变化的点,让紧耦合变的松一些,这样面对需求变化修改代码时才会付出最小的代价,同时也实现了代码的复用,维护.学习的重点不应该放在代码,结构,这些表现形式上.模块之间的紧耦合关系在面对业务变化时是非常脆弱的,会因为一处的修改导致好多地方跟着修改,在面向对象设计中,将高层模块(抽象层)与低层模块(实现层)隔离开,因为抽象层相对稳定,而实现层正是业务需求变化的部分,这也就是依赖倒置原则,可以说整个设计模式都是围绕着寻找抽象层与实现层来展开的.
意图
定义一个用于创建对象的接口,让子类决定实例化哪个类,把实例化工作延迟到子类.
结构
从上图中可以看出,AbstractFactory抽象出了一个createProduct()方法,具体的实现交给了FactoryImplA与FactoryImplB两个实现类,分别对应创建ProductImplA与ProductImplB. 客户端代码调用时直接new的方式给出FactoryImplX具体实例,返回AbstractProduct抽象产品对象.
代码演示
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 抽象产品
*
* @author aladdinty
* @create 2018-01-02
**/
public interface AbstractProduct
{
public String getProductInfo() ;
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 工厂方法基类
*
* @author aladdinty
* @create 2018-01-02
**/
public abstract class AbstractFactory
{
public abstract AbstractProduct createProdct() ;
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 具体的工厂
*
* @author aladdinty
* @create 2018-01-02
**/
public class FactoryImplA extends AbstractFactory
{
@Override
public AbstractProduct createProdct ()
{
return new ProductImplA ();
}
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 工厂实现B
*
* @author aladdinty
* @create 2018-01-02
**/
public class FactoryImplB extends AbstractFactory
{
@Override
public AbstractProduct createProdct ()
{
return new ProductImplB () ;
}
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 具体实现A
*
* @author aladdinty
* @create 2018-01-02
**/
public class ProductImplA implements AbstractProduct
{
@Override
public String getProductInfo ()
{
return "ProductA_IMPL";
}
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 具体实现B
*
* @author aladdinty
* @create 2018-01-02
**/
public class ProductImplB implements AbstractProduct
{
@Override
public String getProductInfo ()
{
return "ProductB_IMPL";
}
}
package com.j2kaka.coolka.common.pattern.factorymethod;
/**
* 调用处
*
* @author aladdinty
* @create 2018-01-02
**/
public class Client
{
public static void main(String[] args )
{
AbstractProduct producta = new FactoryImplA ().createProdct () ;
System.out.println (producta.getProductInfo ());
AbstractProduct productb = new FactoryImplB ().createProdct () ;
System.out.println ( productb.getProductInfo () );
}
}
运行结果
ProductA_IMPL
ProductB_IMPL
应对修改
如果需要增加新的Product实现,只需要增加一个ProductImplXX,再对应增加一个FactoryImplXX,然后修改一下Client的调用处new FactoryImplXX(),当然这个地方可以用反射之类的技术来替代. 应对这种Product产品实现修改的需求时,工厂方法模式完全符合开闭原则. 而之前所说的简单工厂模式则无法做到,因为要修改工厂方法内部的if else判断.当然也不是说工厂方法模式就比简单方法模式高级,只是应用场景不同,工厂方法解决的变化点是产品类型的不固定变化.而简单工厂只是解决调用处对具体产品实现的隔离,假设产品的实现是相对稳定的.