一.分类

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式主要分为三个,简单工厂模式(Simple Factory)/ 工厂方法模式(Factory Method) / 抽象工厂模式(Abstract Factory)。在某些书中分为两类主要是将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

二.详解

      1)简单工厂模式(Simple Factory) 又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据自变量的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

  (1)工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java 类实现。

  (2)抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java 接口或者Java 抽象类实现。

  (3)具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java 类实现。

/*** 产品类的总接口.*/
public interface Car
{void driver();
}public class Coupe implements Car
{public void driver() {System.out.println("双门小汽车...");    }}public class Truck implements Car
{public void driver() {System.out.println("大货车出发了....");        }}/***  创建产品的工厂类.*/
public class CarFactory
{public static Car CarFactory(String carType) {if(CarType.TRUCK.getValue().equals(carType)){return new Truck();}else if(CarType.COUPE.getValue().equals(carType)){return new Coupe();}return null;}
}//------------------------------------------------------------------
//             创建了car enum 方便进行调用
//------------------------------------------------------------------
public enum CarType
{/*** 货车.*/TRUCK("TRUCK"),/*** 双门汽车.*/COUPE("COUPE");private final String value;private CarType(String value) {this.value = value; }public String getValue() {return value;}
}//------------------------------------------------------------------
//            基于JUNIT 的测试类
//------------------------------------------------------------------public class FactoryTest
{@Testpublic void testFactory(){Coupe coupe = (Coupe) CarFactory.CarFactory(CarType.COUPE.getValue());coupe.driver();Truck truck = (Truck)CarFactory.CarFactory(CarType.TRUCK.getValue());truck.driver();}
}

运行结果: 

简单工厂模式的优缺点 

   简单工厂模式的优点如下: 

      (1)工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。

     (2)客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。

     (3)通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

   简单工厂模式的缺点如下:

     (1)由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

       (2)使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。

       (3)系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

       (4)简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

   简单工厂模式的适用环境 

     (1)工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂;

     (2)客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

    2)工厂方法模式(Factory Method) :工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method是一个类的实例化延迟到其子类。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

  工厂方法模式角色

   (1) 抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在上面的 系统中这个角色由Java 接口Creator 扮演;在实际的系统中,这个角色也常常使用抽象Java 类实现。

   (2) 具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体Java 类。具体工厂角色含有与应用密切相关的逻辑,并 且受到应用程序的调用以创建产品对象。在本系统中给出了两个这样的角色,也就是具体Java 类ConcreteCreator1 和 ConcreteCreator2。

   (3)抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在本系统中,这个角色由Java 接口Product 扮演;在实际的系统中,这个角色也常常使用抽象Java 类实现。

   (4)具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

   产品类介绍

/*** * 这是我们的产品类的总接口,就是说我们的每一辆汽车都会有驾驶的功能*/
public abstract class Car {public abstract void driver();
}/*** 大货车 */
public class BigTruck extends Car {    @Overridepublic void driver() {System.out.println("的大货车出发了····");}}public class Bus extends Car {@Overridepublic void driver() {System.out.println("客车开动了 ");}}/*** 小轿车**/
public class Sedan extends Car {@Overridepublic void driver() {System.out.println("小轿车出发了");}}

转载于:https://www.cnblogs.com/hongwz/p/5849815.html

工厂模式(Factory)相关推荐

  1. 设计模式(一)工厂模式Factory(创建型)

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题. ...

  2. 设计模式(四)——工厂模式(Factory Pattern)

    工厂模式(Factory Pattern) 意义 工厂模式 实现了创建者和调用者的分离.将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性 ...

  3. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  4. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  5. 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。

    设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...

  6. [设计模式]工厂模式factory

    参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...

  7. 一文彻底弄懂工厂模式(Factory)

    文章已收录我的仓库:Java学习笔记与免费书籍分享 模式类型 工厂模式属于创建者模式,与对象的创建有关,其中工厂方法模式用于类,而抽象工厂模式用于对象.创建型类模式将对象的部分创建工作延迟到子类,由子 ...

  8. 设计模式之略见一斑(工厂模式Factory)

    在开发中其实我们已经不知道用到了设计模式中的很多模式 ,只是有些我们还未知它具体是哪种模式来着.如工厂模式,单例,适配,外观模式等一些常见模式. 下面是自己学习的一些相关笔记,以做备忘录. 1.工厂模 ...

  9. Spring模式系列(二) 工厂模式(Factory Pattern) - 理解Spring的第一课

    factory pattern在spring的用法 Beanfactory spring框架最依赖的模式,没有之一 这也许是最多程序员使用过的模式之一,我也在我的项目中用过很多次.工厂模式贯穿于整个S ...

  10. 工厂模式(Factory Patter)

    1.工厂模式简介 工厂模式属于创建型模式,是专门用来创建对象的模式,抽象了实例化的过程.工厂模式分为 : 工厂方法模式.抽象工厂模式. 在学习工厂方法模式.抽象工厂之前,首先先要了解一下简单工厂模式, ...

最新文章

  1. 【网络流】解题报告:luogu P2740 [USACO4.2]草地排水Drainage Ditches(Edmonds-Karp增广路,最大流模板)
  2. 《深入实践Spring Boot》一第一部分 Part 1基础应用开发
  3. c++学习总结:extern声明全局变量
  4. sql server常用函数
  5. 几个 PHP 的“魔术常量”
  6. qpython3可视图形界面_PySide——Python图形化界面入门教程(三)
  7. 基于Flask实现后台权限管理系统 - 表设计
  8. 深入理解 AMQP 协议
  9. 为Angular(2+)开发人员提供带TypeScript的Vue.js
  10. java list 效率_Java中5种List的去重方法及它们的效率对比,你用对了吗?
  11. 数据结构(C语言版本)
  12. 【转载】win10环境下,利用自带虚拟机hyper-v安装centos7方法详解
  13. 逃逸分析和标量替换技术,你明白了吗
  14. Shell:用sed命令删除特定行
  15. 抖音招商团长怎么做?怎么入驻?
  16. Python - 在for循环体内修改i值
  17. 【python拼图】遍历文件夹后,自动拼接图像成正方形图,或者指定行数显示
  18. 数学建模 --- 层次分析法(AHP模型)
  19. 关于Berkeley DB打开创建数据库文件
  20. python指纹识别_python实现CMS指纹识别

热门文章

  1. xml c libxml类库使用
  2. InitializeComponent()有什么作用?
  3. 历史回顾,各种编程工具的应用与我的发展历程之二(VB)
  4. rfid商品管理软件_哪个RFID固定资产管理系统比较好用?
  5. tt桌球瞄准器手机版_新年换台新手机!各价位段哪些机型值得入手?
  6. matlab电路环流,基于MATLAB的单芯电缆金属护套环流分析研究
  7. 环境变量太大解决方法
  8. python redis 消息队列_python中利用redis构建任务队列(queue)
  9. .net 程序加密方法
  10. Chrome检查更新总失败?安装细则讲解