研磨设计模式之简单工厂模式-2

2024-01-22 00:58

本文主要是介绍研磨设计模式之简单工厂模式-2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2  解决方案


1  简单工厂来解决

        用来解决上述问题的一个合理的解决方案就是简单工厂,那么什么是简单工厂呢?
1:简单工厂定义


 

2:应用简单工厂来解决的思路
        分析上面的问题,虽然不能让模块外部知道模块内的具体实现,但是模块内部是可以知道实现类的,而且创建接口是需要具体实现类的。
        那么干脆在模块内部新建一个类,在这个类里面来创建接口,然后把创建好的接口返回给客户端,这样外部应用就只需要根据这个类来获取相应的接口对象,然后就可以操作接口定义的方法了。把这样的对象称为简单工厂,就叫Factory吧。
        这样一来,客户端就可以通过这个Factory来获取需要的接口对象,然后调用接口的方法来实现需要的功能,而且客户端也不用再关心具体实现了。


2.2  简单工厂结构和说明

        简单工厂的结构如图5所示:

 

 Api: 
        定义客户所需要的功能接口
Impl:
       具体实现Api的实现类,可能会有多个
Factory:
       工厂,选择合适的实现类来创建Api接口对象
Client:
       客户端,通过Factory去获取Api接口对象,然后面向Api接口编程


2.3  简单工厂示例代码

(1)先看看Api的定义,示例代码如下:

 

复制代码
/*** 接口的定义,该接口可以通过简单工厂来创建*/
public interface Api {/*** 示意,具体的功能方法的定义* @param s 示意,需要的参数*/public void operation(String s);
}
复制代码

 

 

 (2)定义了接口,该来实现它了,ImplA的示例代码如下:

 

复制代码
/*** 接口的具体实现对象A */
public class ImplA implements Api{public void operation(String s) {//实现功能的代码,示意一下
        System.out.println("ImplA s=="+s);}
}
复制代码

 

 

 ImplB的示意实现和ImplA基本一样,示例代码如下:

 

复制代码
/*** 接口的具体实现对象B */
public class ImplB implements Api{public void operation(String s) {//实现功能的代码,示意一下
        System.out.println("ImplB s=="+s);}
}
复制代码

  (3)该来看看简单工厂的实现,示例代码如下:

/*** 工厂类,用来创造Api对象*/
public class Factory {/*** 具体的创造Api对象的方法* @param condition 示意,从外部传入的选择条件* @return 创造好的Api对象*/public static Api createApi(int condition){//应该根据某些条件去选择究竟创建哪一个具体的实现对象,//这些条件可以从外部传入,也可以从其它途径获取。//如果只有一个实现,可以省略条件,因为没有选择的必要。//示意使用条件Api api = null;if(condition == 1){api = new ImplA();}else if(condition == 2){api = new ImplB();}return api;}
}

 

 

 (4)再来看看客户端的示意,示例代码如下:

 

复制代码
/*** 客户端,使用Api接口*/
public class Client {public static void main(String[] args) {//通过简单工厂来获取接口对象
        Api api = Factory.createApi(1);api.operation("正在使用简单工厂");}
}
复制代码

 

 

 

2.4  使用简单工厂重写示例 

        要使用简单工厂来重写前面的示例,主要就是要创建一个简单工厂对象,让简单工厂来负责创建接口对象。然后让客户端通过工厂来获取接口对象,而不再由客户端自己去创建接口的对象了。
        此时系统的结构如图6所示。

 

                      图6  使用简单工厂重写示例的结构示意图

 (1)接口Api和实现类Impl都和前面的示例一样,就不去赘述了。


(2)新创建一个简单工厂的对象,示例代码如下:

 

复制代码
/*** 工厂类,用来创造Api对象*/
public class Factory {/*** 具体的创造Api对象的方法* @return 创造好的Api对象*/public static Api createApi(){//由于只有一个实现,就不用条件判断了
        return new Impl();}
}
复制代码

 

 

 

(3)使用简单工厂
         客户端如何使用简单工厂提供的功能呢?这个时候,客户端就不用再自己去创建接口的对象了,应该使用工厂来获取,经过改造,客户端代码如下:

/**
* 客户端:测试使用Api接口
*/
public class Client {public static void main(String[] args) {//重要改变,没有new Impl()了,取而代之Factory.createApi()
Api api = Factory.createApi();api.test1("哈哈,不要紧张,只是个测试而已!");}
}

 

         就如同上面的示例,客户端通过简单工厂创建了一个实现接口的对象,然后面向接口编程,从客户端来看,它根本就不知道具体的实现是什么,也不知道是如何实现的,它只知道通过工厂获得了一个接口对象,然后就能通过这个接口来获取想要的功能。
         事实上,简单工厂能帮助我们真正开始面向接口编程,像以前的做法,其实只是用到了接口的多态那部分的功能,最重要的“封装隔离性”并没有体现出来。


转自:http://www.cnblogs.com/sjms/archive/2010/12/24/1915669.html


这篇关于研磨设计模式之简单工厂模式-2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/631386

相关文章

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构