工厂方法模式又称为多态性工厂,个人认为多态性工厂更能准确的表达这个模式的用处.与简单工厂(静态工厂)相比较,这里的多态性是指抽象出一个工厂基类,将因为一个产品有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判断.当然也不是说工厂方法模式就比简单方法模式高级,只是应用场景不同,工厂方法解决的变化点是产品类型的不固定变化.而简单工厂只是解决调用处对具体产品实现的隔离,假设产品的实现是相对稳定的.

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

  1. Java设计模式-工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建.在以下的三种模式中,第一种如果传入的字符串有误,不能正确创 ...

  2. .NET设计模式(5):工厂方法模式(Factory Method)(转)

    工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实 ...

  3. .NET设计模式(5):工厂方法模式(Factory Method)

    ):工厂方法模式(Factory Method)    工厂方法模式(Factory Method) --.NET设计模式系列之五 Terrylee,2004年1月2日 转载:http://terry ...

  4. 设计模式---对象创建模式之工厂方法模式(Factory Method)

    前提:“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式(表现最为突出) 工 ...

  5. NET设计模式 第二部分 创建型模式(4):工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实 ...

  6. 工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

    分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的.工厂模式在<Java 与模式>中分为三类:1)简单工厂模式(Simple Facto ...

  7. 设计模式之笔记--工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 定义 工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 类图 描 ...

  8. java设计模式学习 ----- 工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 工厂方法模式分为三种:普通工厂模式.多个工厂方法模式.静态工厂方法模式 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 关系图 ...

  9. 深入浅出设计模式——工厂方法模式(Factory Method)

    介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...

随机推荐

  1. 九、Hadoop学习笔记————Hive简介

    G级别或者T级别都只能用hadoop

  2. 三种方法运行python

    注:本文基于windows 1.交互式解释器 配置好环境变量后,命令行中打开,输入python即可,Ctrl+Z退出 命令行选项 当从命令行启动Python时,可以给解释器一些选项,如下: -d   ...

  3. 从a标签传值中文乱码解决

    <% out.print(new String(request.getParameter("a标签的参数").getBytes("iso8859-1"), ...

  4. js实现关键词高亮显示 正则匹配

    html 和ajax 部分就不写了,只需将需要匹配的文字传进去就可以了 比如匹配后台传回的字符串data.content中的关键词:直接调用: data.content = highLightKeyw ...

  5. Nginx的知识分享,继续上次的分享

    5. Nginx配置文件精讲二 #这里为后端服务器wugk应用集群配置,根据后端实际情况修改即可,tdt_wugk为负载均衡名称,可以任意指定 #但必须跟vhosts.conf虚拟主机的pass段一致 ...

  6. JavaScript参考

    要查看英语原文,请勾选"英语"复选框.也可将鼠标指针移到文本上,在弹出窗口中显示英语原文. 翻译 英语 JavaScript 语言参考 JavaScript 是一种可嵌入网页和其他 ...

  7. 继webpack后又一打包神器Parcel

    前言: 在继grunt.gulp实现自动化构建之后,webpack又引领前端打包潮流,众所周知的是,vue-cli的脚手架就是基于webpack进行项目打包的.而webpack还在上升的势头的时候,又 ...

  8. python处理csv文件问题解决贴

    实际工作中,碰到这么个问题:有个软件跑在linux系统上,其中用到一个数据库是csv格式的,但要向这个数据库添加600行新的数据,数据源同样是一个csv格式的文件. 有了目标,开始干活.首先想到的是, ...

  9. Code Kata:螺旋矩阵 javascript实现

    1 2 3 4  5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9  如图所示,就是一个5*5的螺旋矩阵 我的思路如下: 第一步:拆分 ...

  10. js模拟静态方法

    //模拟静态 var Animal = function(name){ this.name = name; Animal.instanceCounter ++; }; Animal.instanceC ...