登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
园子
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP申请
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
简单工厂模式:提高代码可维护性与扩展性的设计模式 ...
简单工厂模式:提高代码可维护性与扩展性的设计模式
[ 复制链接 ]
倘伟
前天 20:19
哈喽!今天开始,慢慢和大家一起分享我学习和理解设计模式的历程。
前言
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。
让我们从创建型模式开始。先来说说工厂模式!
基本介绍
工厂模式是一种创建型的面向对象设计模式,目的将创建对象的具体过程包装起来,从而达到更高的灵活性。工厂模式的本质就是用工厂方法代替 new 操作创建一种实例化对象的方式,以提供一种方便地创建有同种类型接口的产品的复杂对象。
简单说来:我们不new对象了,让工厂方法来生产对象
工厂模式可以细分如下三类:
简单工厂模式(Simple Factory)
工厂方法模式(Factory Method)
抽象工厂模式(Abstract Factory)
今天来看下工厂模式之简单工厂模式
简单工厂模式
简单工厂模式(Simple Factory)又叫做静态工厂方法(Static Factory Method)模式,但不属于 23 种 GOF 设计模式之一。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
从上面的描述中,我们可以抽象出这么几个角色:
工厂类:负责创建需要的实例
产品抽象类:工厂类能创建出来的所有产品类的抽象。它负责描述所有实例所共有的公共接口。(这里必须要一个抽象类,不然不能保证返回的不同的产品类属于同一个类型)
产品类:工厂类创建出来的目标。它(们)是产品抽象类的具体实现。
示例
产品抽象类:
public interface Phone {
public String info();
}
复制代码
产品类(具体实现类):
public class HuaweiPhone implements Phone{
@Override
public String info() {
return "我是手机华为";
}
}
复制代码
public class ApplePhone implements Phone{
@Override
public String info() {
return "我是苹果手机";
}
}
复制代码
工厂类
public class PhoneFactory{
public static Phone createPhone(String name){
Phone p = null;
switch(type) {
case "huawei":
p = new HuaweiPhone();
break;
case "apple":
p = new ApplePhone();
break;
default:
throw new UnsupportedOperationException("不支持该操作");
}
return p;
}
}
复制代码
让我们来测试下:
public class Test {
public static void main(String[] args) {
SimpleFactory PhoneFactory = new PhoneFactory();
Phone phone1 = PhoneFactory.createPhone("huawei");
System.out.println(phone1.info());
Phone phone2 = PhoneFactory.createPhone("apple");
System.out.println(phone2.info());
}
}
复制代码
输出:
我是华为手机
我是苹果手机
给什么条件,就创建什么类型的实例,就这么简单。不愧简单工厂模式的名号。
简单工厂模式存在的问题
上面的例子中,我们是知道该工厂能创建华为手机和苹果手机。所有我们在测试的时候,也只创建了这两个实例。
如果现在要创建一个”小米手机“,那这个工厂就没法创建出来了
小伙伴可能会说,那就在switch...case...中再增加一个case "xiaomi"吧!
嗯嗯,这个办法能解决”小米手机“的创建问题。但如果后面我们还要陆续创建”oppo手机“”三星手机“...
如果延续这种方法,我们每增加一种手机的创建,就要添加一次case,也就要每次都修改 PhoneFactory 类。这显然是违背了【开闭原则】。同时,这样的工厂类太被动了。
那怎么解决这个问题呢?我们下期再分享。
简单工厂模式总结
工厂类是整个简单工厂模式的关键。包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来(不用直接new对象了),仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的。明确了各自的职责和权利,有利于整个软件体系结构的优化。
但是由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
一句话:虽然简单工厂模式实现了对象的创建和对象的使用分离,但增加新的具体产品需要修改工厂类的判断逻辑代码,违背开闭原则。
为了解决这些缺点,就有了工厂方法模式。
我下回再讲工厂方法,今天先到这里了!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
如何优雅的使用RabbitMQ
分布式锁1 Java常用技术方案
浅谈我对DDD领域驱动设计的理解
游戏编程十年总结(下)
【前端性能】高性能滚动 scroll 及页面渲染优化
验证码对抗之路及现有验证机制介绍
从零开始入门 K8s | 手把手带你理解 etcd
中文写程序,何陋之有?
NHibernate之旅(2):第一个NHibernate程序
公司的中场
FFmpeg开发笔记(六十二)Windows给FFmpeg集成H.266编码器vvenc
Android 系统缺陷不完全点评
谈谈如何从本质上理解sql语句, 存储过程,ORM之间的联系和取舍。
[一步一步MVC]第一回:使用ActionSelector控制Action的选择
.net环境下跨进程、高频率读写数据
第二个iPhone应用程序:“Say Hello”
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
倘伟
前天 20:19
关注
0
粉丝关注
15
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9988
森萌黠
9996
堵赫然
9996
4
凶契帽
9996
5
处匈跑
9996
6
柴古香
9996
7
背竽
9996
8
斜素欣
9994
9
恐肩
9994
10
里豳朝
9994
查看更多