简单工厂
先看一下目录结构
再说一下大致的逻辑,首先创建一个起始接口,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中再新增一个创建的对应产品的抽象,之后再新增一个对应的产品抽象和产品实现。
这样的扩展性非常高,但是违背了开闭原则?为什么呢?
仔细想一想,如果我现在已经有很多工厂了,不同的工厂生产一系列的产品,但是突然我需要给这个抽象工厂新增一个产品?会出现什么情况? 我之前的所有工厂,全部都需要去创建这么一个产品,所有工厂的代码都需要修改。
所以以上三种工厂模式属于创建型设计模式,但是各有优劣具体的设计模式需要在业务中视情况而定。