工厂方法模式(Method Factory),理解多态应用的好例子.

时间:2023-03-09 22:37:25
工厂方法模式(Method Factory),理解多态应用的好例子.

工厂方法模式又称为多态性工厂,个人认为多态性工厂更能准确的表达这个模式的用处.与简单工厂(静态工厂)相比较,这里的多态性是指抽象出一个工厂基类,将因为一个产品有N种不同的是现这种变化封装起来,将具体的实例化延迟到了工厂类的子类中来实现.

谈谈耦合关系先

面向对象设计模式的学习重点应该是寻找业务变化的点,让紧耦合变的松一些,这样面对需求变化修改代码时才会付出最小的代价,同时也实现了代码的复用,维护.学习的重点不应该放在代码,结构,这些表现形式上.模块之间的紧耦合关系在面对业务变化时是非常脆弱的,会因为一处的修改导致好多地方跟着修改,在面向对象设计中,将高层模块(抽象层)与低层模块(实现层)隔离开,因为抽象层相对稳定,而实现层正是业务需求变化的部分,这也就是依赖倒置原则,可以说整个设计模式都是围绕着寻找抽象层与实现层来展开的.

意图

定义一个用于创建对象的接口,让子类决定实例化哪个类,把实例化工作延迟到子类.

结构

工厂方法模式(Method Factory),理解多态应用的好例子.

从上图中可以看出,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判断.当然也不是说工厂方法模式就比简单方法模式高级,只是应用场景不同,工厂方法解决的变化点是产品类型的不固定变化.而简单工厂只是解决调用处对具体产品实现的隔离,假设产品的实现是相对稳定的.