设计模式 — 简单工厂模式(staticFactory)
这篇博文介绍简单工厂模式,设计模式并不是固定的二十三种,不同的书介绍的可能有出入,这篇介绍的简单工厂模式在有些书上就忽略不介绍了。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。从设计模式上的定义可以了解到设计模式的本质,既然是总结出来的,肯定有出入。作为学习设计模式来说,还是把这个也记录下来,能给跟多一些思考。
简单工厂模式是工厂模式的简化版,正因为如此,所以他的使用可以说是非常的普遍,很多代码中都有他的影子。接下来我们剖析简单工厂模式。
不用模式场景
java 是面向对象语言,是面向接口编程。接下来就先来看一个例子。
/****************** 接口 ****************************/
public interface iTest { void funTest(String strTest); } /****************** 类 实现上面接口 ********************/ public class CTest implements iTest { @Override
public void funTest(String strTest) {
// TODO Auto-generated method stub
System.out.println(strTest);
} } /****************** 调用 ********************/
public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
iTest it = new CTest();
it.funTest("I am CTest class!");
}
}
当初我们学习 java 的时候就是这样来实现的,这个在练习和学习里面是没有问题,甚至在不分模块的简单系统里面也是问题不大的。但是想这样一个问题,如果客户端调用的是一个模块,那么我们不仅需要知道这个模块的接口,还需要知道实现那些类,而一个模块里面用到的类是非常多的。这样调用起来非常麻烦,而且还暴露了模块的内部实现逻辑,没有做好模块的内部封装。这样一思考问题就显而易见了。
简单工厂演化
根据模块的封装性,把上面的实现调整一下。
/**
* 引入工厂类
* @author Administrator
*/
public class StaticFactory {
//这里是 static 方法
public static iTest createAPI(){
iTest it = new CTest();
return it;
}
}
引入简单工厂,这个工厂用来创建具体实现,返回的是接口类型。那么再看下客户端调用有什么变化
public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
//iTest it = new CTest();
//it.funTest("I am CTest class!"); /******简单工厂方法的调用*****/
iTest its = StaticFactory.createAPI();
its.funTest("i am created class by StaticFactoy!");
}
}
这儿可以看出来客户端调用已经不用知道具体实现的类型了,具体实现类型已经放入了引入的工厂类来显示了,虽然只是一个小小的变动,但是如果放入了实际的场景中,就有质的变化。
实际运用中的简单工厂模式,当然不是这么简单了,应该有更多的逻辑,这里稍微扩展一下,一个接口一般是实现不同的类,那么可以根据不同的类型来选择不同的实现的类。
/**
* 引入工厂类
* @author Administrator
*/
public class StaticFactory {
/**
* 参数注释1
*/
public static final String Type1 = "1";
/**
* 参数注释2
*/
public static final String Type2 = "2";
//这里是 static 方法
public static iTest createAPI(String Type){
iTest it =null;
if(Type.equals(Type1)){
it = new CTest();
}
else if(Type.equals(Type2)){
it = new Ctest2();
}
return it;
}
} /************ 客户端调用 ****************/ public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//iTest it = new CTest();
//it.funTest("I am CTest class!"); /******简单工厂方法的调用*****/
//iTest its = StaticFactory.createAPI();
//its.funTest("i am created class by StaticFactoy!"); /******改善简单工厂方法的调用*****/
iTest its = StaticFactory.createAPI(StaticFactory.Type1);
its.funTest("我是第一个接口实现");
its = StaticFactory.createAPI(StaticFactory.Type2);
its.funTest("我是第二个接口实现");
}
}
根据不同的参数实现不同的类,而且我们可以把参数在工厂类里面写出来。一方面是便于客户查看,明白参数的用法;另外也可以判断客户是不是输入了非法参数,这儿没有判断非法参数。
上面没有展示通过配置文件来实现简单工厂类,实际上就是把例子中需要传入的参数放入了配置文件中,让客户端调用无需再输入参数。在系统配置连接不同数据库的话,应该就是用的这样的方式。本文不在累述。
总结
定义:提供一个创建对象实例的功能,而不用关心其具体实现。被常见的对象可以是接口、抽象类,具体的类。
分析:简单工厂模式,本质上就是在普通代码上添加一个工厂类,创建对象装在了这个类里面,而且对象具体实现不在这个里面。
优点:
- 调用的接口的封装性更好了,没有暴露内部的逻辑实现。
- 解耦,实现了客户端和具体实现类解耦
- 接口的实现类统一管理了。可以扩展也是只要简单工厂类改动就可以了。
缺点:
- 增加了代码复杂度。
虽然这个简单工厂模式非常简单,但是在系统代码里面运用非常普遍。可能你已经运用了,但是自己没有意识到。简单工厂模式的介绍就到这里了。
设计模式 — 简单工厂模式(staticFactory)的更多相关文章
- 3. 星际争霸之php设计模式--简单工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- C++设计模式——简单工厂模式
简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...
- 深入浅出设计模式——简单工厂模式(Simple Factory)
介绍简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导,所以我想 ...
- C#设计模式--简单工厂模式
简单工厂模式是属于创建型模式,但不属于23种GOF设计模式之一. 举一个例子:一个公司有不同的部门,客户根据需要打电话到不同的部门.客户相当于上端,不同部门相当于下端.不使用简单工厂模式来实现的例子如 ...
- 设计模式 | 简单工厂模式(static factory method)
按理说应该把书全都看完一遍,再开始写博客比较科学,会有比较全面的认识. 但是既然都决定要按规律更新博客了,只能看完一个设计模式写一篇了. 也算是逼自己思考了,不是看完就过,至少得把代码自己都敲一遍. ...
- Yii2设计模式——简单工厂模式
除了使用 new 操作符之外,还有更多的制造对象的方法.你将了解到实例化这个活动不应该总是公开进行,也会认识到初始化经常造成"耦合"问题. 应用举例 yii\db\mysql\Sc ...
- Yii2 设计模式——简单工厂模式
除了使用 new 操作符之外,还有更多的制造对象的方法.你将了解到实例化这个活动不应该总是公开进行,也会认识到初始化经常造成“耦合”问题. 应用举例 yii\db\mysql\Schema 中: // ...
- 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式
1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...
随机推荐
- 2018 API变化
- Flask 源码流程,上下文管理
源码流程 创建对象 from flask import Flask """ 1 实例化对象 app """ app = Flask(__na ...
- How to Change Error Message Colors in Windows 10 PowerShell Console
While this was a really easy way to change some of the settings, what if you want to do more extensi ...
- Multi-View 3D Reconstruction with Geometry and Shading——Part-2
From PhDTheses Multi-View 3D Reconstruction with Geometry and Shading 我们的主要目标是只利用图像中的信息而没有额外的限制或假设来得 ...
- Quick RF Tips for General Reference
传送门:http://www.microwavetools.com/rf-tips-to-make-you-look-smart/ 全文搬运过来的,本篇文章并未有其它意义和目的,仅作为个人参考笔记,我 ...
- fhq_treap 小结
简介 \(fhq\_treap\)是一种非旋平衡树.在学习这篇文章之前,还是先学习一下普通\(treap\)吧 优点 相比于普通的\(treap\),它可以处理区间操作. 相比于\(splay\),它 ...
- 2019年6月pmp考试马上开始!报考9月怎么进行中文报名?
2019年6月pmp考试马上开始了,现在还可不可以报名参加考试呢?来不来得及呢?怎么进行中文报名,考点在哪里?如果现在想报考9月怎么进行中文报名?下面慧翔天地就给大家分享! (关于甘特图的画法,项目管 ...
- MapReduce-CombineTextInputFormat 切片机制
MapReduce 框架默认的 TextInputFormat 切片机制是对任务按文件规划切片,如果有大量小文件,就会产生大量的 MapTask,处理小文件效率非常低. CombineTextInpu ...
- [Android] Android Build 时报错: java.io.IOException: Could not parse XML from android/accounts/annotations.xml
Android构建时报错: app:lintVitalRelease[Fatal Error] :3:214: 与元素类型 “item” 相关联的 “name” 属性值不能包含 ‘<’ 字符. ...
- 开源顶级持久层框架——mybatis(ibatis)——day02
mybatis第二天 高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一个持久层框架,mybatis ...