设计模式(一)---简单工厂模式

1,简介:简单工厂模式,又称为静态工厂模式,是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

2,简单工厂模式的结构

  2.1:简单工厂的通用结构

  

  2.2:示意性实现

  

  2.3:从上图可以看出,简单工厂模式就是由一个工厂类根据传入的参数来决定创建哪个产品的实例

    简单工厂模式涉及到工厂角色,抽象产品角色,以及具体产品角色等三个角色

    2.3.1:工厂类角色:这个工厂类是简单工厂模式的核心,含有与应用相关的业务逻辑,工厂类在客户端的直接调用下创建产品对象,由一个具体的java类来实现

    2.3.2:抽象产品角色:担任这个角色的类是由工厂模式创建的对象的父类,或者是它们共同拥有的接口,抽象产品角色可以用一个java接口或者是抽象类来实现

    2.3.3:具体产品角色:工厂模式创建的对象,都是这个角色的实例,具体产品角色由一个具体的java类来实现

  2.4:源代码

  2.4.1:新建一个食物类的接口。  

package SimpleFactory;/*** ********************************************************  
* @ClassName: Food 
* @Description: 食物接口*  
***********************************************************/
public interface Food {public void say();
}

  2.4.2:建立两个具体产品类  实现食物接口

    1:薯条类 

package SimpleFactory;
/*** ********************************************************  
* @ClassName: Chips 
* @Description: 薯条实体类  实现食品接口 
*  
***********************************************************/
public class Chips  implements Food{@Overridepublic void say(){System.out.println("我是薯条");}
}

  2:麦香鸡类

package SimpleFactory;
/*** ********************************************************  
* @ClassName: McChicken 
* @Description: 麦香鸡实现类   实现食品接口
*  
***********************************************************/
public class McChicken  implements Food{@Overridepublic void say() {System.out.println("我是麦香鸡");}
}

  2.4.3:创建工厂类

package SimpleFactory;
/*** ********************************************************  
* @ClassName: SimpleFacory 
* @Description: 简单工厂模式工厂类,根据传过来的参数确定需要实例化的对象
* 返回实现类的父类类型
*  
***********************************************************/
public class FoodFacory {public static Food getFood(String  type){if(type.equalsIgnoreCase("Chips")){return new Chips();}else if(type.equalsIgnoreCase("McChicken")){return new McChicken();}else{System.out.println("没有可以实例化的对象");return null;}}
}

  2.4.4:创建测试类

package SimpleFactory;
/*** ********************************************************  
* @ClassName: SimpleFactoryTest 
* @Description: 简单工厂模式测试类
*  
***********************************************************/
public class SimpleFactoryTest {public static void main(String[] args){//实例化Chips chips = (Chips) FoodFacory.getFood("Chips");McChicken chicken = (McChicken) FoodFacory.getFood("McChicken");chips.say();chicken.say();}
}

  2.4.5:运行测试类,得到如下结果

  

  3:总结

    3.1:优点:简单工厂模式的核心是工厂类,这个类含有必要的判断逻辑,可以决定在什么时候创建产品类的实例,而客户端可以直接调用工厂类来创建实例,从而免除直接创建实例的责任,简单工厂模式通过这种方式实现了对实例化责任的分割。

    3.2:缺点1,将所有的实例化责任放在一个工厂类里面,如果工厂类不法正常工作,则整个系统崩溃。

          2,而在系统的后续扩展中,都需要修改工厂类,扩展较为困难。

          3,由于工厂类使用静态方法作为工厂类,而静态方法无法被子类继承,因此,工厂角色无法形成继承的等级结构。

转载于:https://www.cnblogs.com/shun-gege/p/7451048.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给LaTex输出的论文PDF加上电子签名

目录问题准备签名插入签名TeXstudio 4.2.3 Windows 10 20H2 参考资料:研究生毕业论文电子签名怎么弄?—— kk肥妹 问题 完成论文之后,需要加上签名,但LaTex输出的结果是PDF格式的 准备签名 准备自己的签名,比如直接…

判断两个矩形相交以及求出相交的区域

问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2&…

【MSP430G2553】图形化开发笔记(1) 配置环境

目录CCS的配置下载和安装激活安装Grace并导入CCS安装MSP430Ware并导入CCS安装XDCtools并导入CCS建立工程Welcome介绍开始打开官方点灯Demo平台: Code Composer Studio 6.2.0 Grace 2.2.0 MSP430G2553 LaunchPad™ Development Kit (MSP-EXP430G2ET) CCS的配置 支…

【现代程序设计】【homework-07】

C11 中值得关注的几大变化 1.Lambda 表达式 Lambda表达式来源于函数式编程,说白就了就是在使用的地方定义函数,有的语言叫“闭包”,如果 lambda 函数没有传回值(例如 void ),其回返类型可被完全忽略。 定义在与 lambda 函数相同作…

Jfinal源码解析系列一

2019独角兽企业重金招聘Python工程师标准>>> 1 Jfinal的初始化入口 <filter><filter-name>jfinal</filter-name><filter-class>com.jfinal.core.JFinalFilter</filter-class><init-param><param-name>configClass</pa…

【MSP430G2553】图形化开发笔记(2) 系统时钟和低功耗模式

目录系统时钟概述BCS模块单元的基本构造时钟-概览介绍Basic User 模式Power User 模式1. 数控振荡器 DCO2. 出厂预校正频率3. 低频振荡器 VLO4. 内部匹配电容5. 延时启动6. 自动选择 MCLK 源7. 时钟输出8. 振荡器失效中断9. 中断事件处理函数10. 退出中断后的节能选项Registers…

alias命令

alias命令&#xff08;取别名之前先运行一下将要使用的别名&#xff0c;以免冲突&#xff09; alias语法&#xff1a;alias 自定义的命令真正的命令 1.使用which查看一个命令的完整命令&#xff0c;也可以查看绝对路径 2.‘alias’查看系统中所有别名&#xff1a; 3.应用 再使用…

奇怪的 加号

转载于:https://www.cnblogs.com/chuyu/p/3421237.html

Java反射机制:表单数据自动封装到JavaBean中【IT】

2019独角兽企业重金招聘Python工程师标准>>> (2010-07-09 19:50:18) 转载▼ 标签&#xff1a; it 分类&#xff1a; IT路人丁 利用Java的反射机制&#xff0c;模拟一个简单的Struts控制器ActionServlet时&#xff0c;为了将请求的表单数据自动封装到JavaBean中&…

eclipse启动tomcat不能正常访问问题

问题&#xff1a; 1、eclipse中配置好tomcat服务器后&#xff0c;启动tomcat查看控制台信息显示启动成功&#xff0c; 但访问tomcat首页报404异常 2、而从tomcat/bin目录中启动后&#xff0c;就能够正常访问首页&#xff0c;由此分析应该是eclipse配置错误 解决方案&#xff1a…

AD域

将网络中的计算机逻辑上组织到一起&#xff0c;将器视为一个整体进行集中管理&#xff0c;这种区别于工作组的逻辑环境叫做Windows域。windows管理模式有两种&#xff1a;工作组和与环境。活动目录的相关概念(1)域和域控制器(2)名称空间(3)对象和属性(4)容器(5)组策略活动目录的…

Python学习笔记19(算法)

1.二分查找 只能用二分查找查找有序列表 def bin_search(data,val): #data为被查找的列表&#xff0c;val是要查找的值low 0high len(data) - 1while low < high:mid (lowhigh)//2if data[mid] val:return mid #找到了&#xff0c;返回val所在的索引elif dat…

C#通过接口与线程通信(捕获线程状态)介绍

摘要&#xff1a;本文介绍C#通过接口与线程通信(捕获线程状态)&#xff0c;并提供简单的示例代码供参考。 提示&#xff1a;本文所提到的线程状态变化&#xff0c;并不是指线程启动、暂停、停止&#xff0c;而是说线程内部状态的迁移。随着软件技术不断发展&#xff0c;用户需求…

php 类文件加载 Autoloader

做习惯了编译语言&#xff0c;转到php 使用 php的面向对象开发时候遇见一个挺别扭的问题。在Php中引入对象 后 在调用过程中还需要将对象所在的php文件 require 到当前php文件 目前代码结构 index.php <?phpuse model\BookModel;include_once __DIR__./autoloader.php; Aut…

【MSP430G2553】图形化开发笔记(4) Timer_A 定时器

目录概述Timer_A 模块16 位主定时器连续计数模式增计数模式增减计数模式主定时器的一般设置捕获/比较模块 CCRx捕获模块比较模块小结Grace中配置Timer_ATimer0_A3 - Overview介绍用例&#xff1a;定时器的启动/停止用例&#xff1a;使用定时器比较模式产生周期性间隔用例&#…

前端UI框架《Angulr》入门

Angulr 项目的名称为 Angulr&#xff0c;对&#xff01;没错&#xff01;就是少个 a&#xff0c;少个 a 就是它正确的拼写。 是一个以 Bootstrap 和 AngularJS 为基础&#xff0c;并使用了大量前端开源组件合成的一个前端UI框架&#xff0c;是非常棒的UI框架。 今天就来和大家讲…

Flask使用Flask-SQLAlchemy操作MySQL数据库

https://www.jianshu.com/p/6ae0d30a5539 前言&#xff1a; Flask-SQLAlchemy是一个Flask扩展&#xff0c;简化了在Flask程序中使用SQLAlchemy的操作。SQLAlchemy是一个很强大的关系型数据库框架&#xff0c;支持多种数据库后台。SQLAlchemy提供了高层ORM&#xff0c;也提供了…

会计基础模拟练习一(3)

会计基础模拟练习一&#xff08;3&#xff09; 下周一18号会计从业资格考试就要报名了,本人重点看的是会计基础和会计电算化,做了一下测试题,五十多分,较之前有了一些长进.很多之前重点复习的章节有了明显的提升,像后面的几章没怎么看,出错的概率就大大的提升了. 我觉得这个考试…

MacOS中Dock栏的设置和使用技巧,新手必看

MacOS中Dock栏的设置和使用技巧&#xff0c;新手必看 Dock栏就是Mac放置常用应用程序和文件夹快捷方式的任务栏&#xff0c;为你访问这个应用和文件提供了非常方便的入口。 作为Mac用户最常使用的区域&#xff0c;要知道如何才能更高效的使用它&#xff0c;从而达到事半功倍的…

51Nod 1003 阶乘后面0的数量 | 思维

题意&#xff1a;n的阶乘后面0的个数&#xff0c;如果直接算出阶乘再数0的数量一定会超时的。因为102*5,所以求出5贡献的次数就行。#include "bits/stdc.h" using namespace std; #define LL long long #define INF 0x3f3f3f3f3f #define PI acos(-1) #define N 510 …