工厂模式

原创 2018年04月16日 09:54:01

1. 模式的定义
工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类

2.模式的结构
   工厂方法模式包含如下角色:
   Product:抽象产品
   ConcreteProduct:具体产品
   Factory:抽象工厂
   ConcreteFactory:具体工厂

3.模式的优缺点
工厂方法模式的优点

  • 用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
  • 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。
  • 在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了,完全符合“开闭原则”。

工厂方法模式的缺点

  • 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
  • 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

4.模式适用环境

  1. 一个类不知道它所需要的对象的类
  2. 一个类通过其子类来指定创建哪个对象
  3. 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

实例:日志记录器
某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式,现使用工厂方法模式设计该系统。
日志记录器
Log.java

public interface Log {
    public void writeLog();
}

LogFactory.java

public interface LogFactory {
  public Log createLog(); 
}

FileLog.java

public class FileLog implements Log {
    @Override
    public void writeLog() {
        System.out.println("now is fileLog....");
    }
}

DataBaseLog.java

public class DataBaseLog implements Log {
    @Override
    public void writeLog() {
        System.out.println("now is dbLog...");
    }
}

FileLogFactory.java

public class FileLogFactory implements LogFactory {
    @Override
    public Log createLog() {
        return new FileLog();
    }
}

DataBaseLogbFactory.java

public class DataBaseLogbFactory implements LogFactory {
    @Override
    public Log createLog() {
        return new DataBaseLog();
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
        Log log;
        LogFactory lf;
        lf=new FileLogFactory();
        log=lf.createLog();
        log.writeLog();
    }
}

关于工厂模式的作用。为什么要用工厂模式?

关于工厂模式的作用。为什么要用工厂模式?
  • kocscs123
  • kocscs123
  • 2016-11-20 19:56:15
  • 2991

为什么工厂模式是华而不实的—浅谈工厂模式的利与弊

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17428923说明:博主虚心接受大家的抨击,批评,指正前言我一直想介绍下工厂模...
  • singwhatiwanna
  • singwhatiwanna
  • 2013-12-20 01:26:25
  • 14915

工厂模式及在项目中的应用

工厂模式分为简单工厂、工厂方法模式和抽象工厂模式。简单工厂顾名思义是最简单的,从一个工厂获取所需的产品类似于factory.getProduct1();或factory.getProduct2(),最...
  • empyan
  • empyan
  • 2017-02-06 21:20:16
  • 4530

面试问题,多态,工厂模式

具体说,多态就是基类的指针在调用虚函数成员的时候,运行时系统会根据指针实际指向的对象调用恰当的成员函数。 当一个方法在不同的环境中有不同的实现时,可以使用多态,抽象出一个接口,子类有不同的实现。 ...
  • digaoyang
  • digaoyang
  • 2014-12-03 10:13:19
  • 1438

java中的工厂模式是什么,请举例说明

工厂模式就是在接口和子类之间加入了一个过渡端,通过此过渡端获得接口的实例化对象,这个过渡端也就是所谓的工厂类。这样以后如果再有程序子类要扩充,直接修改工厂类客户端就可以根据标记得到相应的实例,增加了程...
  • maguanghui_2012
  • maguanghui_2012
  • 2015-08-02 22:11:42
  • 1834

三种工厂模式区别总结

工厂模式分为三种:简单工厂、工厂模式和抽象工厂模式。三者之间存在哪些异同呢?先分别看看各个模式的特点 一、     简单工厂模式: 实现了算法和界面的分离,也就是将业务逻辑和界面逻辑分开了,降低了耦...
  • lingfengtengfei
  • lingfengtengfei
  • 2013-10-07 10:40:15
  • 29904

java设计模式---浅谈2种工厂模式和单例模式

1、 工厂模式  。比如有一个统一接口  A   ,这个A接口是一个标准  。如果有类  B  和 C   那么 BC必须实现A接口  。 我们在以往的 方法生成这种对象的时候   A  b=new...
  • yue7603835
  • yue7603835
  • 2012-04-13 23:08:12
  • 12700

设计模式(一) 工厂模式 五种写法总结

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52703280本文出自:【张旭童的博客】系列开篇瞎BB设计模式相关的文章学习与总结,一...
  • zxt0601
  • zxt0601
  • 2016-10-12 16:47:11
  • 32561

iOS工厂模式的实质性总结

最近在公司搞分享活动,索性就分享了工厂模式这个看似大家都不重视的设计模式。实际上开发过程中用到的场景不少啊。 经过初步的了解和认识工厂之后,再去你们公司项目工程里面看看代码,肯定有不少之处用到了工厂模...
  • qq_25475307
  • qq_25475307
  • 2017-08-17 18:11:43
  • 461

【js设计模式笔记---工厂模式】

工厂模式 简单工厂 最好用一个例子来说明简单工厂模式的概念。假设你想开几个自行车商店,每个店都有几种型号的自行车出售。这可以用一个类来表示 /*BicycleShopclass*/ var Bicyc...
  • pigpigpig4587
  • pigpigpig4587
  • 2014-05-16 14:50:08
  • 2032
收藏助手
不良信息举报
您举报文章:工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)