简单工厂、工厂方法、抽象工厂的区别

简单工厂

先看一下目录结构

目录结构
再说一下大致的逻辑,首先创建一个起始接口,IUser,之后出现一个用户需要去实现这个用户接口,按照以往的创建逻辑,每次一个用户进行一次new,工厂意味着自己不需要去在乎他的创建逻辑,不需要知道怎么创建,只需要给定一个约束值,通过这个约束值我就知道如何去创建自己想要的某个对象,让使用者只在乎结果,不必在乎过程。

在这里插入图片描述

这里是项目的结构图,userWang 实现了IUser接口,从而别的用户新增进来也是,当这些用户出现一些共性的时候,只需要新增一个类去实现这个IUser接口可以做到统一管理。

简单工厂的用法,看到create(String) 这个String就是一个约束值,上代码:
在这里插入图片描述
可以看到里面是使用了if 进行判断,当name为wang的时候就知道去创建IUserWithWang 这个对象,当出现 zhang的时候就可能创建IUserWithZhang。
在这里插入图片描述
而创建只需要实例化一个工厂对象,去传入某个值就可以创建各种你想要的对象,所以这个模式叫工厂,你只需要给材料,我就给你一个你想要的东西

但是简单工厂有一个不好的地方,我需要一个新的对象,我是不是都要去修改这个if判断加上各种else if?就违反了开闭原则。
开闭原则:对接口扩展开放,对修改关闭。即:只能扩展不能修改

当然可以说,可以传入Class啊,传入完整包名啊,进行一个反射创建实例,但是还是需要传参,如果任意传参错误了怎么办?

工厂方法

先上结构图
在这里插入图片描述
可以看到多出一个 工厂接口,上关系图。
在这里插入图片描述
工厂方法,实现了单一职责、开闭原则,但是不好扩展。
可以从图里面看出大概意思**,一个工厂只做一件事**,我Wang工厂我就只创建Wang这个用户,那么我出现一个Zhang,出现一个Liu等等多个用户,我都要创建一个工厂一个用户类,会产生很多类。

工厂方法:让子类去决定创建哪一个对象。

看一下代码:
IUser和UserWang 代码内容不变。
在这里插入图片描述
在这里插入图片描述
Wang这个工厂实现了用户工厂,我这个Wang工厂我只创建Wang用户,你要别的用户,那么麻烦你去别的工厂,这样就实现了开闭原则。我不管你要什么,我这个工厂只创建我想创建的。
就避免了if…else…

在这里插入图片描述

指定某一个工厂进行创建某一个对象。

抽象工厂

先上结构图
在这里插入图片描述

关系图
在这里插入图片描述
可以看出一个工厂现在可以创建多个产品了,当再出现一个产品如果是一个系列的只需要在IUserFactory中再新增一个创建的对应产品的抽象,之后再新增一个对应的产品抽象和产品实现。

这样的扩展性非常高,但是违背了开闭原则?为什么呢?
仔细想一想,如果我现在已经有很多工厂了,不同的工厂生产一系列的产品,但是突然我需要给这个抽象工厂新增一个产品?会出现什么情况? 我之前的所有工厂,全部都需要去创建这么一个产品,所有工厂的代码都需要修改。

所以以上三种工厂模式属于创建型设计模式,但是各有优劣具体的设计模式需要在业务中视情况而定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值