目录


代码讲解

产品功能接口:

/**
* 定义接口,抽象出产品都具有的功能
*/
interface Produce {
void method();
}

工厂类:

/**
* 我们下面的代码,模拟API
*/
public class SimpleFactory { //根据传进来的参数,返回对应的对象
public static Produce factory(String produce) throws Exception {
Produce produce1;
switch (produce) {
case "Piano":
produce1 = new Piano();
break;
case "Motorcycle":
produce1 = new Motorcycle();
break;
default:
produce1 = null;
} if (produce1 == null) {
throw new RuntimeException("没有参数对应的产品");
} else {
return produce1;
}
} }

具体实现类:

/**
* 钢琴类
*/
class Piano implements Produce { @Override
public void method() {
System.out.println("制造一架钢琴!");
}
} -------------------------------------------------------------- /**
* 摩托车类
*/
class Motorcycle implements Produce { @Override
public void method() {
System.out.println("制造一台摩托车!");
}
}

测试:

  /**
* 下的代码,模拟客户端,在客户端调用上面的API
*/
@Test
public void test() throws Exception {
// 客户端需要制造一台钢琴
Produce produce = SimpleFactory.factory("Piano");
produce.method(); // 客户端制造一台摩托车
Produce produce1 = SimpleFactory.factory("Motorcycle");
produce1.method(); }

UML图解简单工厂


优点

  • 隐藏具体实现
  • 解耦
  • 简单

分析优点

我们可以想象我们是一个API设计者 ,我们设计出一个框架,对外提供一些产品; 如何设计这个框架,是一个技术活,要尽量做到,对客户端 隐藏具体实现,同时满足简单解耦的特点;

我们讲的简单工厂模式,是可以满足我们的要求的,具体怎么满足的,请看下面的分析;

Produce1Produce2,这样的具体产品实现类,是API的设计者实现的,客户端的程序员是不用知道具体的实现的,他们只需要知道怎么用,就好了,这也就对客户端程序员 隐藏了具体实现

对于一些非常复杂,创建对象很麻烦的类,更能体现出 简单 的优点,因为怎么 new实例,都是在 API 设计者在 工厂类 里面自己帮客户端程序员new好了,客户端程序员只要直接使用这个对象就好了,不需要关心怎么new出来的

解耦 是如何实现的呢?其实很简单,因为客户端没有new xxx 这样的硬编码啊,后期就是API的设计者,把框架的代码,都改了,各种类(除了工厂类)的名字都换了,只要工厂类的名字、方法名字没变,客户端的代码,一行都不要动;这是多么的美滋滋;


缺点:

  • 扩展麻烦,需要改动现有的代码
  • 孤注一掷

其实仔细看代码,就能发现缺点,假如框架新增加了一些产品类,那么我们的工厂类的代码,就需要改动,这是爽了客户端程序员,麻烦了API设计者 ;

所有的逻辑都放在一个工厂里面,一旦这个类出现什么问题,那么就全GG ;


改进:

要想改变这种缺点,就需要使用 工厂方法模式 了 ;

最新文章

  1. JQuery 实现标题与内容相呼应样式
  2. C# 调用C++ SDK/API的问题总结
  3. qt 单文档程序关闭时在delete ui处出现segmentation fault
  4. Powershell获取并导出指定日期EventLog
  5. @InitBinder
  6. O(1)时间内删除指定链表结点
  7. C# 之 System.Diagnostics.Process.Start的妙用
  8. linux 开机自动挂载ntfs盘
  9. android创建自定义对话框
  10. JS——基础知识
  11. JS中都有哪些数据类型呢?
  12. C++ Primer 5 CH6 函数
  13. hdu1312 Red and Black 简单BFS
  14. python函数式编程之迭代器
  15. Python机器学习—导入各种数据的N种办法
  16. Caffe源码理解1:Blob存储结构与设计
  17. linux子系统ubuntu16.04安装使用xrdp当远程桌面
  18. docker之tomcat简单部署
  19. 卷积神经网络CNN的原理(一)---基本概念
  20. UVA437-The Tower of Babylon(动态规划基础)

热门文章

  1. Manjaro Linux无备份迁移home目录
  2. lucene正向索引(续)——一个文档的所有filed+value都在fdt文件中!!!
  3. arcgis python ValueTable使用
  4. Shell中的$0、$1、$2的含义
  5. Oracle的大表,小表与全表扫描
  6. Xgboost建模
  7. EINVRES Request to https://bower.herokuapp.com/packages/ failed with 502
  8. 在Linux下使用LLVM Clang以及Blocks
  9. osg::NodeVisitor example
  10. 34 Flutter仿京东商城项目 用户注册 注册流程 POST发送验证码 倒计时功能 验证验证码