目录


代码讲解

产品功能接口:

/**
* 定义接口,抽象出产品都具有的功能
*/
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 ;


改进:

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

java的简单工厂模式的更多相关文章

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

    以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...

  2. Java实现简单工厂模式

    昨天看了一下设计模式,复习了一下简单工厂模式,做个笔记,浅淡一下我对简单工厂模式的理解.书上使用的是C#,因为我所学的是Java,所以本人就用Java实现了一遍.如果有讲的不对的地方,希望能够指出来. ...

  3. Java反射+简单工厂模式总结

    除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...

  4. Java设计模式 -- 简单工厂模式(SimpleFactory)

    一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(C ...

  5. 设计模式(java)--简单工厂模式之女娲造人.水果农场

    女娲抟土造人 话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面. 女娲造人,这就是简单工厂模式的应用.  首先,在这个造人的思 ...

  6. Java设计模式-简单工厂模式(Static Factory Method)

    简单工厂模式(Static Factory Method) 简单工厂模式是类的创建模式,又叫静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种 ...

  7. java设计模式--简单工厂模式

     简单工厂设计模式 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式.它定义一个用于创建对象的接口,由子类决定实例化哪一个类. 核心知识点如下: (1) 大 ...

  8. java之简单工厂模式详解

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  9. java 创建简单工厂模式

    1.抽象类 package com.zpark.service; /** * 定义一个环境接口,所有省治理环境的方式都实现这个接口,并重写治理环境的方法 * @author tong * */ pub ...

随机推荐

  1. Unrecognized syntax identifier "proto3". This parser only recognizes "proto2". ”问题解决方法

    编译cartographer时遇到Unrecognized syntax identifier “proto3”. This parser only recognizes “proto2”.排查:使用 ...

  2. 页面tr和td的的隐藏与显示

    <view:qrytr attributes="class=zcrzs"> </view:qrytr>     var bd11 = $("tr[ ...

  3. Python读写Excel文件和正则表达式

    Python 读写Excel文件 这里使用的是 xlwt 和 xlrd 这两个excel读写库. #_*_ coding:utf-8 _*_ #__author__='观海云不远' #__date__ ...

  4. Alpha冲刺(2/4)

    队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11885037.html 作业博客 :https://edu.cnblogs.com/campus/f ...

  5. 从结构到性能,一文概述XGBoost、Light GBM和CatBoost的同与不同

    尽管近年来神经网络复兴并大为流行,但是 boosting 算法在训练样本量有限.所需训练时间较短.缺乏调参知识等场景依然有其不可或缺的优势.本文从算法结构差异.每个算法的分类变量时的处理.算法在数据集 ...

  6. C++利用openssl进行公钥解密

    私钥加密的部分内容,需要用公钥解密下面的实例代码,由于私钥加密后的字符串有不可打印字符,所以程序里面进行了base64,要用的时候先解dec base64 再传递给函数 进行解密 #include & ...

  7. JavaScript原型,原型链 ? 有什么特点?

    每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时, 如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会 ...

  8. 【Oracle/Java】以Insert ALL方式向表中插入百万条记录,耗时9分17秒

    由于按一千条一插程序长期无反应,之后改为百条一插方式,运行完发现插入百万记录需要9m17s,虽然比MySQL效率差,但比单条插入已经好不少了. 对Oracle的批量插入语法不明的请参考:https:/ ...

  9. Kibana的安装与配置

    Kibana的安装与配置 配置 [root@es01 kibana-5.6.3-linux-x86_64]# egrep -v '^$|^#' config/kibana.yml server.hos ...

  10. Pytho之Django

    Django工程目录讲解: manage.py脚本:用于管理Django站点 settings.py: 包含项目的所有配置参数 urls.py: URL根配置 wsgi.py: 内置runserver ...