设计模式(Java语言)- 简单工厂模式
简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式。简单工厂模式通过对外提供一个静态方法来统一为类创建实例。简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建出来的,只需要调用简单工厂模式的方法来统一创建就可以了,从而明确了各个类的职责。
一、创建简单工厂模式的步骤
第一步:声明一个抽象类(接口),以及对应的抽象方法,由实现类分别去实现这个方法。
第二步: 创建具体实现类,实现抽象方法。
第三步:创建一个简单工厂类,声明一个静态方法,根据传入的不同的类型来确定创建抽象类的具体实现类。
第四步:客户端通过工厂类获取实例对象。
二、应用案例:
下面以制造手机为例子,在现实生活中可能有很多工厂可以创建不同品牌的手机,这些工厂可以根据不同的需求来创建不同的手机。根据上面的步骤,首先我们需要一个抽象类,所以我们需要知道不同品牌的手机其实都是属于手机这种类别,因此我们可以将手机抽出来做成一个抽象类:
/**
* 手机类
*/
public interface Phone {
//制造手机的方法,留给具体的实现类来制造
void create();
}
第二步我们需要开始制造不同品牌的手机了:
制造华为手机
public class Huawei implements Phone {
@Override
public void create() {
System.out.println("====正在制造华为手机======");
}
}
苹果手机
public class Iphone implements Phone {
@Override
public void create() {
System.out.println("====正在制造苹果手机======");
}
}
第三步我们需要创建一个工厂方法,返回手机类。具体制造什么品牌的手机,需要根据传进来的手机名字来决定,因此我们可以这么写:
public class SimpleFactory { public static Phone createPhone(String name) {
if ("huawei".equals(name))
return new Huawei();
else
return new Iphone(); } }
第四步,手机创建好了,我们就可以使用了,即客户端调用工厂方法创建对象实例
public class Client { public static void main(String[] args) {
Phone huawei = SimpleFactory.createPhone("huawei");
huawei.create(); Phone iphone = SimpleFactory.createPhone("iphone");
iphone.create();
} } //输出结果
====正在制造华为手机======
====正在制造苹果手机======
到这里,简单工厂模式基本已经写完了,仔细看会发现这种方法创建对象违反了ocp原则,每次增加不同品牌手机的时候都需要在工厂方法里添加不同的条件判断。如果手机品牌越来越多,代码看起来非常臃肿,很不利于后期的代码维护。因此,我们改进一下,不要通过手机品牌名称来判断需要创建哪一中对象了,而是客户端想要创建什么对象,只需要传入具体的实现类就可以了,然后通过Java的反射来创建对象。
public class SimpleFactory2 { public static Phone create(Class<? extends Phone> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
} }
客户端调用
public class Client { public static void main(String[] args) {
Phone huawei = SimpleFactory2.create(Huawei.class);
huawei.create(); Phone iphone = SimpleFactory2.create(Iphone.class);
iphone.create();
} }
//运行结果
====正在制造华为手机======
====正在制造苹果手机======
经过修改之后,每次增加新的手机品牌时就不用修改工厂方法的逻辑了。但是,还是有一个问题,就是每次创建对象都是通过反射来创建的,所以在性能上是有一定的损耗的。
三、总结:
优点:
1、简单优化了软件体系结构,明确了各自功能模块的职责和权利
2、通过工厂类,外界不需要直接创建具体产品对象,只需要负责消费,不需要关心内部如何创建对象
缺点:
1、改进前的简单工厂模式全部创建逻辑都集中在一个工厂类中,能创建的类只能是考虑到的,如果需要添加新的类,就必须改变工厂类了
2、改进前的简单工厂模式随着具体产品的不断增多,可能会出现共产类根据不同条件创建不同实例的需求,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免功能模块的蔓延,对系统的维护和扩展不利
3、改进后的简单工厂模式主要是使用反射效率会低一些
设计模式(Java语言)- 简单工厂模式的更多相关文章
- java设计模式-----1、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...
- Java设计模式2:简单工厂模式
简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...
- java 之 简单工厂模式(大话设计模式)
以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
- 设计模式(java)--简单工厂模式之女娲造人.水果农场
女娲抟土造人 话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面. 女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思 ...
- Java描述设计模式(02):简单工厂模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根 ...
- Java实现简单工厂模式
昨天看了一下设计模式,复习了一下简单工厂模式,做个笔记,浅淡一下我对简单工厂模式的理解.书上使用的是C#,因为我所学的是Java,所以本人就用Java实现了一遍.如果有讲的不对的地方,希望能够指出来. ...
- Java反射+简单工厂模式总结
除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...
- C#设计模式系列:简单工厂模式(Simple Factory)
1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
随机推荐
- CentOS 7.7版本中NAT上网问题
一.NAT(地址转换模式)概念 如果你的网络ip资源紧缺,但是你又希望你的虚拟机能够联网,这时候NAT模式是最好的选择.NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网. 二.具体 ...
- 如何正确的在 Android 上使用协程 ?
前言 你还记得是哪一年的 Google IO 正式宣布 Kotlin 成为 Android 一级开发语言吗?是 Google IO 2017 .如今两年时间过去了,站在一名 Android 开发者的角 ...
- [网络流 24 题] luoguP2763 试题库问题
[返回网络流 24 题索引] 题目描述 假设一个试题库中有 nnn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 mmm 道题组成试卷.并要求试卷包含指定类型的试题. ...
- opencv::Sobel算子
卷积应用-图像边缘提取 卷积应用-图像边缘提取 边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一, 在图像特征提取.对象检测.模式识别等方面都有重要的作用. 如何捕捉/提取边缘 – 对图像 ...
- python中eval的使用
eval函数就是实现str与list.dict.tuple之间的转化栗子: a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" aa = eval( ...
- vue系列文章 --- 源码目录结构整理(三)
vue的版本是:^2.6.10 结构如下: |----- vue | |--- dist # 打包之后的目录vue文件 | | |--- vue.common.dev.js | | |--- vue. ...
- 微信小程序开发注意事项(优化项)
最近公司有一个小程序开发项目,自己也自学了不少,有一些开发小心得,记录在这里. 小程序开发中注意: 1,setData 小程序视图层和逻辑层在两个独立的模块,并不具备数据直接传递的,setData相当 ...
- 百万年薪python之路 -- 文件操作练习
1.有如下文件,a1.txt,里面的内容为: 老男孩是最好的学校, 全心全意为学生服务, 只为学生未来,不为牟利. 我说的都是真的.哈哈 分别完成以下的功能: a,将原文件全部读出来并打印. with ...
- gulp 自动化管理工具实现全过程
1.全局安装gulp npm install gulp -g 2.项目内安装gulp npm install gulp -s 3.项目根目录新建gulpfile.js js内代码: //载入gulp核 ...
- selenium学习-拖拽页面元素
一.ActionChains包 模拟鼠标的操作要首先引入ActionChains的包 from selenium.webdriver.common.action_chains import Actio ...