这篇博文介绍简单工厂模式,设计模式并不是固定的二十三种,不同的书介绍的可能有出入,这篇介绍的简单工厂模式在有些书上就忽略不介绍了。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。从设计模式上的定义可以了解到设计模式的本质,既然是总结出来的,肯定有出入。作为学习设计模式来说,还是把这个也记录下来,能给跟多一些思考。

  简单工厂模式是工厂模式的简化版,正因为如此,所以他的使用可以说是非常的普遍,很多代码中都有他的影子。接下来我们剖析简单工厂模式。

不用模式场景

     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)的更多相关文章

  1. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. Golang设计模式—简单工厂模式(Simple Factory Pattern)

    Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...

  3. C++设计模式——简单工厂模式

    简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...

  4. 深入浅出设计模式——简单工厂模式(Simple Factory)

    介绍简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导,所以我想 ...

  5. C#设计模式--简单工厂模式

    简单工厂模式是属于创建型模式,但不属于23种GOF设计模式之一. 举一个例子:一个公司有不同的部门,客户根据需要打电话到不同的部门.客户相当于上端,不同部门相当于下端.不使用简单工厂模式来实现的例子如 ...

  6. 设计模式 | 简单工厂模式(static factory method)

    按理说应该把书全都看完一遍,再开始写博客比较科学,会有比较全面的认识. 但是既然都决定要按规律更新博客了,只能看完一个设计模式写一篇了. 也算是逼自己思考了,不是看完就过,至少得把代码自己都敲一遍. ...

  7. Yii2设计模式——简单工厂模式

    除了使用 new 操作符之外,还有更多的制造对象的方法.你将了解到实例化这个活动不应该总是公开进行,也会认识到初始化经常造成"耦合"问题. 应用举例 yii\db\mysql\Sc ...

  8. Yii2 设计模式——简单工厂模式

    除了使用 new 操作符之外,还有更多的制造对象的方法.你将了解到实例化这个活动不应该总是公开进行,也会认识到初始化经常造成“耦合”问题. 应用举例 yii\db\mysql\Schema 中: // ...

  9. 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式

    1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...

随机推荐

  1. Python之Mock的入门

    参考文章: https://segmentfault.com/a/1190000002965620 一.Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟 ...

  2. OpenStack视图

    OpenStack视图 OpenStack视图是个全局资源的概念,统计了OpenStack所纳管资源的总量和使用量,因此OpenStack视图的资源通常又称为物理资源.OpenStack基于该资源使用 ...

  3. .Net Core实践3 配置文件

    环境 .netcore2.1 / vs2017 / win10 / centos7 在.netcore项目中读取配置文件,先添加应用程序配置文件App.config.这个是类库项目的配置文件名. Sy ...

  4. [powershell]获取FCID&Port

    Get-InitiatorID Get-InitiatorPort

  5. Hackers' Crackdown UVA - 11825 (状压dp)

    给出n个电脑,每个电脑连着n个服务,然后每个电脑都连着m个邻电脑,如果当前的电脑某个服务被断开了,相邻的电脑的服务也会被断开,每个电脑都只能操作一次,问你最多可以让多少种服务被断开.一种服务被断开的条 ...

  6. JDK源码分析(9) LinkedHashMap

    概述 LinkedHashMap是一个关联数组.哈希表,它是线程不安全的,允许key为null,value为null.他继承自HashMap,实现了Map<K,V>接口.其内部还维护了一个 ...

  7. VO、DTO、DO、PO

    领域模型中的实体类可细分为4种类型:VO.DTO.DO.PO. PO(Persistent Object):持久化对象,表示持久层的数据结构(如数据库表): DO(Domain Object):领域对 ...

  8. 安装python的pywin32安装不了,提示找不到py3.6-32

    安装python的pywin32安装不了,提示找不到py3.6-32 首先我自己的py3.6是64位版本的,这是pywin32模块的下载地址 里面有各种版本的,首先我先下了64位的3.6版本的,结果提 ...

  9. Linux常用命令大全(转载收藏)

    转载自鸿燕藏锋:https://www.cnblogs.com/yjd_hycf_space/p/7730690.html 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比 ...

  10. 【OpenGL】代码记录01创建窗口

    创建空窗口: #include<iostream> // GLEW #define GLEW_STATIC #include <GL/glew.h> // GLFW #incl ...