开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
背景:一只菜鸟在一次实习工作中,被老板要求写一个方法,其实说来也挺简单的:根据传入的压缩包,以及压缩包名后缀进行解压,解压之后读取其中的xml文件,转为json格式返回即可。可惜的是,菜鸟没有学过设计模式,简单使用Switch进行判断,完成之后被老板说:这个没有扩展性,没有灵活性。算了!我自己做吧。 菜鸟很是受打击,开始了学习设计模式之路~
简单工厂模式
这是一个非常简单的设计模式,简单到菜鸟第一眼都看懂了,相信大神的你们也很容易看懂学会!
难度:一颗星
故事背景
话说有一天,菜鸟打暑假工,去到了一个工厂流水线里面上班,工厂流水线目前是做手机螺丝的,我们用代码表示就是
public class Person {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String name;
public void work(){
System.out.println(name+"打螺丝!");
}
}
public class AssemblyLine {
public static void main(String[] args) {
Person person = new Person();
person.name="菜鸟";
person.work();
}
}
需求变更
不过今年因为口罩原因,老板一拍手,我还要接下口罩的生意,顺便还要做手机的生意,反正我有流水线,我就想多赚一点钱! 那这时候,我们原来的代码就需要更改了
public class Person {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String name;
public void work(){
System.out.println(name+"打螺丝!");
}
public void Mouthmuffle(){
System.out.println(name+"做口罩!");
}
public void Phone(){
System.out.println(name+"做手机!");
}
}
这一改代码,给老板嫌弃的,你可以回家了。现在去财务那边结清一下工资!
求助大佬
菜鸟赶紧回家,打电话给大佬
-
菜鸟:大大,我怎么办啊,我因为这个代码被辞退了!
-
大佬:不怪老板,我要是老板我都辞退你!这样子写,那我岂不是要一直改原来的代码?万一以后我还想接别的业务,那是不是要一直改动代码呢??
-
菜鸟:大大教教我吧,我上有八十岁老母,下有一岁孩子啊~
-
大佬:别扯了,你才20岁,好了好了,我教你一下,就一下啊,看你悟性了!
大佬随手一挥,写下代码
public class Person {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String name;
//这里接受一个接口
public void work(IWork Business){
Business.work();
}
}
public interface IWork {
//定义一个工作内容的接口
void work();
}
public class Phone implements IWork {
@Override
//实现这个接口,重写这些工作内容
public void work() {
System.out.println("做手机");
}
}
public class Screw implements IWork{
@Override
//实现这个接口,重写这些工作内容
public void work() {
System.out.println("打螺丝!");
}
}
public class MouthMuffle implements IWork {
@Override
//实现这个接口,重写这些工作内容
public void work() {
System.out.println("做口罩");
}
}
//创建工作内容的工厂
public static IWork WorkFactory(String workName) {
IWork work;
//创建对应的类
switch (workName) {
case "口罩":
work = new MouthMuffle();
break;
case "螺丝":
work = new Screw();
break;
case "手机":
work = new Phone();
break;
default:
work = null;
System.out.println("没有这个业务啊兄弟!");
break;
}
return work;
}
public class AssemblyLine {
public static void main(String[] args) {
Person person = new Person();
person.name = "菜鸟";
//在这里了只需要和简单工厂说,需要什么,他就会返回对应的实例对象给你
person.work(WorkFactory("口罩"));
person.work(WorkFactory("螺丝"));
person.work(WorkFactory("手机"));
}
-
菜鸟:哇,大大,那这样子,我只需要增加对应的类,和修改switch的判断就可以了。
-
大佬:是的,但是还是不太符合我们的开闭原则。这就是简单工厂的缺点了!
总结
在实际开发过程中,简单工厂算是比较简单的设计模式了,我们一看就能看懂啦
优点
- 不直接在客户端创建具体工作的实例,降低了耦合性。
缺点
- 违反了开闭原则,(对扩展开放,对修改关闭),不容易形成高内聚松耦合结构。 每当我们增加一种产品的时候就要去修改工厂方法,这样会破坏其内聚性,给维护带来额外开支