工厂方法模式

  • 简单描述:也是创建型模式的一种,目的就是对象的创建和使用解耦。不需要关心对象的创建过程,说白了张嘴要就行。

  • 应用场景:网上那些冠冕堂皇的应用场景,真的懒得粘了,啥时候补充一个具体的项目应用场景

    工厂方法模式是从简单工厂模式演变过来的,来一段简单的代码。现场需要对接两种类型的摄像头设备,分别为型号A,B,现在要通过两台设备进行拍照并获得照片

简单工厂模式代码

public interface Camera {String getPicUrl();
}
public class CameraA implements Camera{@Overridepublic String getPicUrl() {System.out.println("获取A摄像头的图片地址");}
}
public class CameraB implements Camera{@Overridepublic String getPicUrl() {System.out.println("获取B摄像头的图片地址");}
}
public class CameraFactory{public static Camera getCamera(String code){if("1".equals(code)){return new CameraA();}else if("2".equals("code")){return new CameraB();}return null;}public static void main(String[] args) {Camera camera = CameraFactory.getCamera("1");if(camera!=null){product.getPicUrl();}}
}

从上面代码分析看,完全符合目前的需求,但是随着业务的增长,现在平台又接入了一台型号是C的摄像机,这样我们对接的时候就要修改cameraFactory里的代码了,如果单纯加这么一个也没啥,但是以后又多了个D、E、F…呢?是不是感觉每次都要改代码,有点不爽?因为我们这样设计违反了开放-封闭原则,所以有了改良版的工厂方法模式,代码如下:

public interface CameraFactory {Camera getCamera();
}public interface Camera {String getPicUrl();
}
public class CameraA implements Camera{@Overridepublic String getPicUrl() {System.out.println("获取A摄像头的图片地址");}
}
public class CameraB implements Camera{@Overridepublic String getPicUrl() {System.out.println("获取B摄像头的图片地址");}
}public class CameraAFactory implements CameraFactory{@Overridepublic Camera getCamera() {return new CameraA();}
}
public class CameraBFactory implements CameraFactory{@Overridepublic Camera getCamera() {return new CameraB();}
}
public class Test {public static void main(String[] args) {CameraFactory a = new CameraAFactory();a.getCamera().getPicUrl();}
}

来欣赏一下这次的改造,为每个型号的摄像机都分配了一个工厂,这样,新增加一个型号的时候,只要新增对应的工厂类就行了。然而,到这里大家也发现了,如果增加一个新的型号,就要多两个类,一个工厂类,一个具体的型号类。这样随着型号的增多,紧随着类的数量会暴涨,慎重哦!!!

抽象工厂模式

抽象工厂模式就是在工厂模式上进行的扩展,从另一方面来说,工厂方法模式是抽象工厂模式的一个特例。就想正方形和长方形的概念是的,正方形是一个特殊的长方形。

对于上述的需求我们加以改造,如果再加一套门禁设备,我们负责控制门禁设备的开关。则进行改造下,就变成如下代码

public interface BasicFactory {BasicCamera getCamera();BasicDoorDevice getDoorDevice();
}
public interface BasicCamera {String getImgUrl();
}
public interface BasicDoorDevice {boolean setDoorStatus(boolean flag);
}
public class FactoryA implements BasicFactory{@Overridepublic BasicCamera getCamera() {return new CameraA();}@Overridepublic BasicDoorDevice getDoorDevice() {return new DoorDeviceA();}
}
public class FactoryB implements BasicFactory{@Overridepublic BasicCamera getCamera() {return new CameraB();}@Overridepublic BasicDoorDevice getDoorDevice() {return new DoorDeviceB();}
}
public class CameraA implements BasicCamera {@Overridepublic String getImgUrl() {System.out.println("摄像机A");return null;}
}
public class CameraB implements BasicCamera {@Overridepublic String getImgUrl() {System.out.println("摄像机B");return null;}
}
public class DoorDeviceA implements BasicDoorDevice {@Overridepublic boolean setDoorStatus(boolean flag) {System.out.println("控制门禁A");return false;}
}
public class DoorDeviceB implements BasicDoorDevice {@Overridepublic boolean setDoorStatus(boolean flag) {System.out.println("控制门禁B");return false;}
}
public class Test {public static void main(String[] args) {BasicFactory fac = new FactoryA();fac.getCamera().getImgUrl();fac.getDoorDevice().setDoorStatus(true);}
}

谜一般的设计模式:工厂方法模式和抽象工厂模式相关推荐

  1. 抽象工厂和工厂方法示例_抽象工厂设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

  2. 『创建型』简单工厂SimpleFactory、工厂方法FactoryMethod、抽象工厂AbstractFactory

    为什么80%的码农都做不了架构师?>>>    几点说明 永远不要纠结于在什么时候使用什么模式 永远不要纠结于什么模式适用于什么情景 永远不要去死记任何的模式 并不是说,23种设计模 ...

  3. 对设计模式的总结之工厂方法模式和抽象工厂模式

    前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓 ...

  4. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  5. 021 设计模式之工厂方法模式,抽象工厂模式的区别

    简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...

  6. 设计模式的征途—3.工厂方法(Factory Method)模式

    上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则.如何实现新增新产品而 ...

  7. Java设计模式之工厂方法模式与抽象工厂模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.前期回顾 上一篇<Java设计模式之单例模式>详细介绍了单例模式,介绍了单例模式的使用场景,优缺点,同时也写了 ...

  8. 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...

    转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...

  9. 设计模式之工厂方法模式、抽象工厂模式的概念和实现及使用“反射技术+读取配置文件”的方法对工厂模式进行改进(软件工程综合实践课程第三周个人作业)

    文章目录 一.实验目的 二.知识总结 1.工厂方法模式简介 2.抽象工厂模式简介 3.工厂模式小结 4.利用"反射技术+读取配置文件"的方法改进程序 三.实验内容 1. 工厂模式实 ...

最新文章

  1. 牛客练习赛61 D 最短路变短了(最短路,反向最短路)难度⭐⭐⭐★
  2. MFC消息映射的定义
  3. JQuery 定期刷新网页,保持登录状态Session
  4. java实现图片验证码
  5. 笨方法学python3怎么样_抖音笨李白是什么歌 抖音笨李白歌曲歌词介绍
  6. java关键字和标识符_Java数据类型和标识符
  7. 如何使用悲观锁定修复乐观锁定竞争条件
  8. 计算机打开管理工具空白,大师解决win10系统打开设备管理器却显示空白的办法...
  9. python常用代码总结-python字典的常用方法总结
  10. 贝叶斯集锦:贝叶斯派和频率派的一个例子
  11. android学习日记20--连接组件之Intent和IntentFilter
  12. 计算机应用基础考试excel操作题,自学考试_《计算机应用基础》_上机操作_模拟练习题...
  13. 【系统分析师之路】第五章 复盘软件工程(开发模型开发方法)
  14. 超级记忆/图像数字记忆 110位数字图像转换表 31-40
  15. 测试要找苹果机型,哪里有?
  16. 锐捷RSR路由器搭建PPTP服务器
  17. win7\win10加域的电脑不输入密码直接登录登录电脑桌面
  18. C语言生成BMP文件
  19. unity 2019 点击脚本启动不了VS_蚂蚁森林能量脚本,无需ROOT+支持模拟器
  20. python电子表格_Python操作 Excel表格

热门文章

  1. 获取视频帧图片,FFmpegMediaMetadataRetriever修改,优化,提高加载速度
  2. java agent配置,部署 Java Agent
  3. 构建Java开发高性能网站需要关注的事儿
  4. 浅谈2020web前端大趋势
  5. 最全的CSS浏览器兼容问题整理(IE6.0、IE7.0 与 FireFox)(收藏)
  6. 距阵乘以一个未知距阵得单位矩阵 怎么算_一个机械门外汉用了三个月,花了四千元就自己造了台车床!震撼!...
  7. 抽奖活动mysql表设计_中奖数据表设计方案
  8. elementui table表头添加图标
  9. 【日常】MAC外接显示屏
  10. PPT神技能,如何使用PPT制作炫酷视频?我想你还是不会吧!