上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法。本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式工厂方法抽象工厂模式

简单工厂模式

简单工厂模式是属于创建型模式,又叫做静态工厂方法模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。调用只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类工厂的子类。 可以说是工厂模式中最简单的一种。

打个比方,我们在电脑经常玩游戏,我们只需要告诉电脑我们要玩什么游戏,电脑就会打开这个游戏,我们并不需要关心游戏是怎么运作的。
我们可以在以下的代码中进行相应的说明。

我们首先创建一个游戏总类接口,包含一个玩游戏的方法; 然后再由各自的游戏类继承该类并实现该类的方法,最后在创建一个工程类根据不同的游戏类型进行创建对象。

   简单工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

那么实现的代码如下:

代码示例:

  1. private static final String LOL="LOL";
  2. private static final String DNF="DNF";
  3.  
  4. public static void main(String[] args) {
  5. Game game= ComputerFactory.playGame(LOL);
  6. Game game2= ComputerFactory.playGame(DNF);
  7. game.play();
  8. game2.play();
  9. }
  10. }
  11.  
  12. interface Game{
  13. void play();
  14. }
  15.  
  16. class LOL implements Game{
  17. @Override
  18. public void play() {
  19. System.out.println("正在玩LOL...");
  20. }
  21. }
  22.  
  23. class DNF implements Game{
  24. @Override
  25. public void play() {
  26. System.out.println("正在玩DNF...");
  27. }
  28. }
  29.  
  30. class ComputerFactory{
  31. private static final String LOL="LOL";
  32. private static final String DNF="DNF";
  33. public static Game playGame(String game){
  34. if(LOL.equalsIgnoreCase(game)){
  35. return new LOL();
  36. }else if(DNF.equalsIgnoreCase(game)){
  37. return new DNF();
  38. }
  39. return null;
  40. }

输出结果:

  1. 正在玩LOL...
  2. 正在玩DNF...

我们在使用简单工厂模式进行实现该功能之后,会发现我们将游戏类的实例化放到了工厂类中实现,隐藏了对象创建的细节,并且不需要知道是怎么玩的,只需要知道调用该工厂类就行了。而且方便切换,因为只需更改工厂类传递的类型值就行了。
但是我们也发现一个问题,如果我们需要新增一个游戏类,那么需要新定义一个接口,然后还要在工厂类中添加一个判断分支,如果少量的话还好,但是大量的话就比较麻烦了,并且这也违背了开放-封闭原则,所以要想解决此类问题,就需要用到接下来的模式。

工厂方法模式

工厂方法模式是 Java 中最常用的设计模式之一,属于创建型模式。定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

在简单工厂模式中,我们发现在添加子类的时候,相应的也需要在工厂类中添加一个判断分支,是违背了开放-封闭原则的。而工厂方法模式就是主要解决这个问题的。

这里还是用上述的玩游戏示例,只不过这里每个游戏都是由各自的游戏工厂类实现。主要区别就是由一个 工厂类变成了多个了,降低了耦合度。如果新增一个游戏类,相应的也只需在新增一个工厂类而已, 并且完美的遵循了开放-封闭原则。

       工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

将上述代码更改之后,相应的代码实现如下:

代码示例:

  1. private static final String LOL="LOL";
  2. private static final String DNF="DNF";
  3. private static final String WOW="WOW";
  4.  
  5. public static void main(String[] args) {
  6.  
  7. Game game3=new LOLFactory().playGame();
  8. Game game4=new DNFFactory().playGame();
  9. Game game5=new WOWFactory().playGame();
  10. game3.play();
  11. game4.play();
  12. game5.play();
  13. }
  14.  
  15. interface Game{
  16. void play();
  17. }
  18.  
  19. class LOL implements Game{
  20. @Override
  21. public void play() {
  22. System.out.println("正在玩LOL...");
  23. }
  24. }
  25.  
  26. class DNF implements Game{
  27. @Override
  28. public void play() {
  29. System.out.println("正在玩DNF...");
  30. }
  31. }
  32.  
  33. class WOW implements Game{
  34. @Override
  35. public void play() {
  36. System.out.println("正在玩WOW...");
  37. }
  38. }
  39.  
  40. interface ComputerFactory2{
  41. Game playGame(String game);
  42. }
  43.  
  44. class LOLFactory implements ComputerFactory2{
  45. @Override
  46. public Game playGame() {
  47. return new LOL();
  48. }
  49. }
  50.  
  51. class DNFFactory implements ComputerFactory2{
  52. @Override
  53. public Game playGame() {
  54. return new DNF();
  55. }
  56. }
  57.  
  58. class WOWFactory implements ComputerFactory2{
  59. @Override
  60. public Game playGame() {
  61. return new WOW();
  62. }
  63. }

输出结果:

  1. 正在玩LOL...
  2. 正在玩DNF...
  3. 正在玩WOW...

可以看到使用工厂方法模式之后,我们的代码更加清晰了,扩展性也变高了,如果想增加一个产品,只要扩展一个工厂类就可以。但是随之而来的是在系统中增加了复杂度,每增加一个产品时,都需要增加一个具体类和对象实现工厂类。
所以在是否使用该模式需注意。
使用该模式比较经典的使用案例是大名鼎鼎的hibernate框架在选择数据库方言这块。但是如果直接简单的new一个对象的话,则不必使用了,若使用反而会增加系统的复杂度。

抽象工厂模式

抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。也就是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

抽象工厂模式相比工厂方法模式来说更加复杂,也更难理解,但是更容易扩展。
抽象工厂模式就将同一类的产品子类归为一类,让他们继承同一个抽象子类,然后把它们当作一组,然后再把多个组组成一个族。
打个比方,还是上述的玩游戏,我们可以把LOLWOW当作PVP类型的游戏,也可以把DNFWOW当作PVE类型的游戏。

那么相应更改的代码如下:

代码示例:

  1. interface Game{
  2. void play();
  3. }
  4.  
  5. class LOL implements Game{
  6. @Override
  7. public void play() {
  8. System.out.println("正在玩LOL...");
  9. }
  10. }
  11.  
  12. class DNF implements Game{
  13. @Override
  14. public void play() {
  15. System.out.println("正在玩DNF...");
  16. }
  17. }
  18.  
  19. class WOW implements Game{
  20. @Override
  21. public void play() {
  22. System.out.println("正在玩WOW...");
  23. }
  24. }
  25.  
  26. interface ComputerFactory3{
  27. Game playGame();
  28. Game playGame2();
  29. }
  30.  
  31. class PVPFactory implements ComputerFactory3{
  32.  
  33. @Override
  34. public Game playGame() {
  35. return new LOL();
  36. }
  37.  
  38. @Override
  39. public Game playGame2() {
  40. return new WOW();
  41. }
  42. }
  43.  
  44. class PVEFactory implements ComputerFactory3{
  45.  
  46. @Override
  47. public Game playGame() {
  48. return new DNF();
  49. }
  50.  
  51. @Override
  52. public Game playGame2() {
  53. return new WOW();
  54. }
  55.  
  56. }
  57. private static final String LOL="LOL";
  58. private static final String DNF="DNF";
  59. private static final String WOW="WOW";
  60.  
  61. public static void main(String[] args) {
  62. ComputerFactory3 cf3=new PVPFactory();
  63. cf3.playGame().play();
  64. cf3.playGame2().play();
  65. ComputerFactory3 cf4=new PVEFactory();
  66. cf4.playGame().play();
  67. cf4.playGame2().play();
  68. }
  69. }

输出结果:

  1. 正在玩LOL...
  2. 正在玩WOW...
  3. 正在玩DNF...
  4. 正在玩WOW...

在抽象工厂模式中,可以在不需要知道产品是怎么样的,只需知道是哪个工厂类就行了。我们也可以根据子类的共同的特性而将它们设计在一起,组成一个相同类型组,可以很方便的直接调用。但是相对的,产品族比较难以扩展,增加一个产品,需要增加相应的接口和实现类。例如某个品牌的手机,有不同系列,每个系列有不同的型号,如果只是增加型号的话,比较容易,但是相对的,增加某个系列就比较麻烦了。
所以我们在使用抽象工厂模式,也需要相应的结合实际场景来使用。

Java设计模式之二工厂模式的更多相关文章

  1. Java设计模式之二 ----- 工厂模式

    在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模式,又 ...

  2. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  3. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  4. Java进阶篇设计模式之二 ----- 工厂模式

    前言 在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模 ...

  5. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

  6. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  7. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  8. (1)java设计模式之简单工厂模式

    一:简单工厂模式的优点          --->在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Fa ...

  9. Java设计模式系列之工厂模式

    工厂模式将大量有共同接口的类实例化,工厂模式可以实现动态决定实例化哪一个类的对象,工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factory):添加某一种类型的 ...

随机推荐

  1. Vue2.0的核心思想

    Vue的核心思想为数据驱动和组件化. 一.数据驱动——双向绑定 Vue是一种MVVM框架.而DOM是数据的一个种自然映射.传统的模式是通过Ajax请求从model请求数据,然后手动的触发DOM传入数据 ...

  2. ceph 剔除osd

    先将osd.2移出集群 root@ceph-monster:~# ceph osd out osd.2 marked out osd.2. root@ceph-monster:~# ceph osd ...

  3. (备忘)Java web项目迁移到Centos7中验证码无法显示

    每天多学一点知识. 今天部署项目的时候出现验证码无法显示的问题,如下图所示:

  4. Keras实现Self-Attention

    本文转载自:https://blog.csdn.net/xiaosongshine/article/details/90600028 一.Self-Attention概念详解 对于self-atten ...

  5. dict排序

    根据dict值排序 c = {1:10,2:9,3:8} c = sorted(c.items(), key=lambda d: d[1], reverse=1) reverse=1 从大到小排列 起 ...

  6. mysql 数据库的时间与字符串转换

    .当前日期.时间 now() 获取 当前日期和时间 :: curdate() 当前日期, curtime() 当前时间 :: current_time() : //同curtime(),current ...

  7. TOPk实现(python)

    import heapq class TopK: def __init__(self, iterable, k): self.minheap = [] self.capacity = k self.i ...

  8. 0032ActiveMQ之java编码实现生产者和消费者操作队列queue

    今天学习了入门级的用java编写生产者producer和消费者consumer操作activemq的queue队列,为了之后复习回顾,现做整理如下: maven工程的搭建此处不再讲解,在maven工程 ...

  9. LG4213 【模板】杜教筛(Sum)和 BZOJ4916 神犇和蒟蒻

    P4213 [模板]杜教筛(Sum) 题目描述 给定一个正整数$N(N\le2^{31}-1)$ 求 $$ans_1=\sum_{i=1}^n\varphi(i)$$ $$ans_2=\sum_{i= ...

  10. 完成一个springboot项目的完整总结------三

    这一次的总结是最关键的部分,主要涉及了ORM的三种操作,这些操作是项目的难点,三种操作包括多对一.多对多.一对多三种模式,接下来展示项目代码 1.多对一 clazz表对应grade表和charge表 ...