工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 .

1 . 工厂方法模式的定义

定义一个创建对象的接口 , 让子类决定实例化哪一个类 . 工厂方法模式使一个类的实例化延迟到子类

2 . 工厂方法模式的特点

将"类实例化的操作"和"使用对象的操作"分开 , 让使用者不用知道具体参数就可以实例化出所需要的"产品"类 , 从而避免了在代码中显式指定 , 实现了解耦 .

3 . 工厂方法模式的实现思路

  1. 创建抽象产品接口 , 定义具体产品实例的方法
  2. 创建具体产品类(实现抽象产品接口) , 定义生产的具体产品
  3. 创建抽象工厂接口 , 定义具体工厂的通用接口
  4. 创建具体工厂类(实现抽象工厂接口) , 定义创建具体产品实例的方法
  5. 外界通过调用工厂类的方法 , 从而创建不同产品类的实例

4 . 工厂方法模式的应用场景

  1. 当一个类不需要知道它所需要的对象类别时
  2. 无序关注对象的内部实现时

5 . 代码实现

1 . 简单工厂模式(工厂模式的变种很多 , 简单工厂模式就是工厂模式家族中最简单实用的一种模式) , 又叫做静态工厂方法模式(Static Factory Method) , 简单工厂模式是由一个工厂对象创建某一产品的实例 , 主要由三部分组成

  1. 工厂类角色 : 该模式的核心 , 用来创建产品 , 包含创建产品的相关逻辑和判断
  2. 抽象产品角色 : 指具体产品继承的父类或者实现的接口
  3. 具体产品角色 : 工厂类所创建的对象就是该角色的实例
/** 抽象产品接口 - 汽车 */
public interface ICar {void getCar();
}
/** 具体产品类 : 跑车 */
public class SportCar implements ICar{@Overridepublic void getCar() {System.out.println("得到一辆跑车 . ");}
}/** 具体产品类 : 越野车 */
class JeepCar implements ICar{@Overridepublic void getCar() {System.out.println("得到一辆越野车 . ");}
}/** 具体产品类 : 小货车 */
class BuggyCar implements ICar{@Overridepublic void getCar() {System.out.println("得到一辆小货车 . ");}
}
/** 简单工厂核心类 :  */
public class SimpleFactory {public static final int CAR_TYPE_SPORT = 1;public static final int CAR_TYPE_JEEP= 2;public static final int CAR_TYPE_BUGGY = 3;public static ICar getCar(int carType){if(carType == CAR_TYPE_SPORT){return new SportCar();}else if(carType == CAR_TYPE_JEEP){return new JeepCar();}else if(carType == CAR_TYPE_BUGGY){return new BuggyCar();}else{throw new RuntimeException("啥车都没找到");}}
}
/** 调用工厂方法 */
public class SimpleFactoryDemo {public static void main(String[] args) {System.out.println("来到汽车工厂 , 准备取车 : ");try {ICar car =SimpleFactory.getCar(SimpleFactory.CAR_TYPE_SPORT);car.getCar();}catch (Exception e){System.out.println(e.getMessage());}}
}

调用者不再关注实例化什么对象 , 只需要将需求告诉工厂类 , 工厂类就会实例化相应的类 , 调用者不需要知道生产的细节就可以使用产品

2 . 综上述代码来看 , 不难发现简单工厂模式存在一系列问题 :

  1. 工厂类集中了所有实例的创建逻辑 , 一旦这个工厂不能正常工作 , 整个系统都会受到影响 .
  2. 违背"开放-关闭"原则 , 一旦添加新产品就不得不修改工厂类的逻辑 , 造成工厂类过于臃肿 .
  3. 简单工厂模式由于使用了静态工厂方法 , 静态方法不能被继承和重写 , 会造成工厂角色无法形成基于继承的等级结构 .

为了解决以上问题 , 我们又使用了新的工厂方法模式 . 工厂方法模式相对简单工厂模式多了一个角色

  • 抽象工厂角色 : 与生产过程无关 , 任何在模式中创建的工厂类必须实现这个接口

抽象产品接口和产品实例类与之前一样 , 其他类代码如下

/** 抽象工厂接口 */
public interface IFactoryMethod{ICar createCar();
}
/** 工厂实现类 */
public class SportFactory implements IFactoryMethod{@Overridepublic ICar createCar() {return new SportCar();}
}class JeepFactory implements IFactoryMethod{@Overridepublic ICar createCar() {return new JeepCar();}
}class BuggyFactory implements IFactoryMethod{@Overridepublic ICar createCar() {return new BuggyCar();}
}
/** 调用工厂方法 */
public class FactoryMethodDemo {public static void main(String[] args) {System.out.println("来到汽车工厂 , 准备取车 : ");IFactoryMethod factory1 = new SportFactory();//A工厂ICar car1 = factory1.createCar();System.out.print("A取车 : ");car1.getCar();IFactoryMethod factory2 = new JeepFactory();//B工厂ICar car2 = factory2.createCar();System.out.print("B取车 : ");car1.getCar();}
}

6 . 总结

  1. 单一职责
  2. 开闭原则
  3. 调用者无需关心实现

JAVA设计模式 - 工厂方法模式相关推荐

  1. Java设计模式--工厂方法模式

    工厂方法模式 1.工厂方法模式的概述 1.1工厂模式是简单工厂模式的延伸,符合开闭原则的基础上,还可以在增加新的具体产品对象时不需要对已有系统做任何修改. 1.2工厂方法模式:定义一个用于创建对象的接 ...

  2. 《转》java设计模式--工厂方法模式(Factory Method)

    本文转自:http://www.cnblogs.com/archimedes/p/java-factory-method-pattern.html 工厂方法模式(别名:虚拟构造) 定义一个用于创建对象 ...

  3. Java设计模式-工厂方法模式和抽象工厂模式

    工厂方法模式定义: 即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)."一对一"的关系 1,一抽象工厂类派生出多个具体工厂类: 2, ...

  4. Java设计模式—工厂方法模式抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

  5. Java设计模式-工厂方法模式的使用和介绍

    一.工厂方法模式简介 1.定义 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorph ...

  6. java设计模式---工厂方法模式

    简单工厂模式的应用就是用来创建一个对象,简单工厂模式是将所有对象的初始化集于一个具体的工厂类来实现,这个工厂类负责所有产品的创建,但是这种创建只能创建单一的产品,如简单工厂模式里的ChickenFac ...

  7. java设计模式——工厂方法模式

    工厂方法模式:为工厂类定义了接口,使用多态来削弱工厂类的职责. * 将简单工厂创建对象的职责分担到子工厂类中,子工厂相互独立,互相不受影响. * 工厂方法模式也有他的局限性,当面对有复杂的树形结构的产 ...

  8. Java——设计模式(工厂方法模式)

    * A:工厂方法模式概述* 工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现.* 简单来说:先定义一个工厂,工厂里面有些方法,这些方法就是用来创建动物的,然 ...

  9. 我的Java设计模式-工厂方法模式

    转载 https://zhuanlan.zhihu.com/p/29549253 转载于:https://www.cnblogs.com/thiaoqueen/p/8298328.html

最新文章

  1. 自动驾驶激光雷达物体检测技术
  2. POJ 2236 Wireless Network 并查集
  3. 自己搭建个对象存储服务难不难?
  4. Android之UI控件
  5. Tomcat 7.0~10.0zip版,安装版,其他一键式全部下载
  6. FTPClient登录慢的问题
  7. tableau 倒序都倒了_Tableau优秀作品拆解复刻01-是时候终结瘘管病了
  8. Flowable 数据库表结构 ACT_ID_USER
  9. 怎么修改腾讯视频的昵称
  10. 为何优秀如程序员,也会构建 Bug 满格的软件?
  11. python工程师工资多少-最新 | 2019年Python工程师的平均薪资是多少?
  12. SSAS : 如何编写自定义挖掘算法
  13. 物体检测中的mAP含义
  14. a letter and a number
  15. Node.js 实现远程桌面监控
  16. Selpg—Golang
  17. Spring核心机制——IoC和AOP
  18. uboot 中内存测试,内存检测方法
  19. 个人项目-仿微信小打卡小程序
  20. 如何让3ds Max 2016导入smd文件

热门文章

  1. 小程序开发 缓存的应用
  2. IOS 创建简单表视图
  3. 这是一个关于软件开发的博客。
  4. linux下php安装
  5. Dapper试用简例
  6. Enterprise Library访问Access数据库
  7. 【转】单元测试基础知识
  8. 关于table的用法(二)
  9. 机器学习之数据归一化
  10. Spring事务处理之 编程式事务 和 声明式事务