工厂方法模式又称为多态性工厂,个人认为多态性工厂更能准确的表达这个模式的用处.与简单工厂(静态工厂)相比较,这里的多态性是指抽象出一个工厂基类,将因为一个产品有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. LINQ学习系列-----2.2 迭代器

    在学习本篇迭代器之前,强烈建议可以先学习一位具有工匠精神博主的文章,链接如下: 农码一生---先说IEnumerable,我们每天用的foreach你真的懂它吗? 本篇文章,是在该博主博文的基础上再次 ...

  2. Web App适配iPhoneX

    前言 Iphone每次退出新尺寸的手机都会掀起一番适配风波,这次没有下巴但有刘海的iPhoneX更是如此,网传横屏下的适配动画更是令不少人汗颜. 其实对于Native App来说,适配并不算困难(当然 ...

  3. 使用sklearn进行数据挖掘-房价预测(1)

    使用sklearn进行数据挖掘系列文章: 1.使用sklearn进行数据挖掘-房价预测(1) 2.使用sklearn进行数据挖掘-房价预测(2)-划分测试集 3.使用sklearn进行数据挖掘-房价预 ...

  4. django 图片上传 前段+后端

    1.前台<form method="post" action="./writerApply" enctype="multipart/form-d ...

  5. POJ 1511 Invitation Cards 链式前向星+spfa+反向建边

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 27200   Accepted: 902 ...

  6. Subquery returns more than 1 row

    Subquery returns more than 1 row表示子查询返回了多行数据 例如: select * from table1 where table1.colums=(select co ...

  7. H5混合开发二维码扫描以及调用本地摄像头

    今天主管给了我个需求,说要用混合开发,用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触过,心里没底 ...

  8. Android用户登录机制安全性的一些思考

    1  client要做到安全存贮数据非常难,通过反编译和强攻.仅仅要有心,差点儿都能够破解. 2  服务端相对安全. 3  结合以上两点,推出能做的点是控制灾难规模.每次破解一个client仅仅能针对 ...

  9. 负载均衡之基于L7负载

    L7负载平衡 还有一种较为经常使用的负载平衡解决方式则是L7负载平衡.顾名思义,其主要通过OSI模型中的第七层应用层中的数据决定怎样分发负载. 在执行时.L7负载平衡server上的操作系统会将接收到 ...

  10. Apache HTTPserver安装后报:无法启动,由于应用程序的并行配置不对-(已解决)

    原创作品.出自 "深蓝的blog" 博客.欢迎转载,转载时请务必注明出处.否则有权追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...