大白话设计模式-简单工厂模式

142 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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的判断就可以了。

  • 大佬:是的,但是还是不太符合我们的开闭原则。这就是简单工厂的缺点了!

总结

在实际开发过程中,简单工厂算是比较简单的设计模式了,我们一看就能看懂啦

优点

  • 不直接在客户端创建具体工作的实例,降低了耦合性。

缺点

  • 违反了开闭原则,(对扩展开放,对修改关闭),不容易形成高内聚松耦合结构。 每当我们增加一种产品的时候就要去修改工厂方法,这样会破坏其内聚性,给维护带来额外开支