Java设计模式:工厂模式

简单工厂模式:

首先,举一个例子吧,假如你有一所学校:

package com.zzx.设计模式.工厂模式.简单工厂;

/**
 * @Author Zhengzx
 * @Date 2022/9/20 15:44
 * @Title 简单工厂模式
 * @Version 1.0
 * @Describe
 */
public interface School {
    public void task();
}

再然后学校有老师对吧,校长可以指派老师做事情,

老师一: 张三

package com.zzx.设计模式.工厂模式.简单工厂;

/**
 * @Author Zhengzx
 * @Date 2022/9/20 15:47
 * @Title 简单工厂模式
 * @Version 1.0
 */
public class Teacher01 implements School{


    @Override
    public void task() {
        System.out.println("张三老师去扫地");
    }
}

老师二: 李四

package com.zzx.设计模式.工厂模式.简单工厂;

/**
 * @Author Zhengzx
 * @Date 2022/9/20 15:47
 * @Title 简单工厂模式
 * @Version 1.0
 */
public class Teacher02 implements School{


    @Override
    public void task() {
        System.out.println("李四老师去擦窗户");
    }
}

老师三: 王五

package com.zzx.设计模式.工厂模式.简单工厂;

/**
 * @Author Zhengzx
 * @Date 2022/9/20 15:47
 * @Title 简单工厂模式
 * @Version 1.0
 */
public class Teacher03 implements School{


    @Override
    public void task() {
        System.out.println("王五老师去买一包Cigarette");
    }
}

最后还有一位脾气暴躁的老师四: 野猪佩奇

package com.zzx.设计模式.工厂模式.简单工厂;

/**
 * @Author Zhengzx
 * @Date 2022/9/20 15:47
 * @Title 简单工厂模式
 * @Version 1.0
 */
public class Teacher04 implements School{


    @Override
    public void task() {
        System.out.println("野猪佩奇:你TM消遣我们呢???");
    }
}

最后,校长指派老师做事:

package com.zzx.设计模式.工厂模式.简单工厂;

/**
 * @Author Zhengzx
 * @Date 2022/9/20 15:52
 * @Title
 * @Version 1.0
 */
public class HeadMaster {
    public static void main(String[] args) {
        Teacher01 teacher01 = new Teacher01();
        teacher01.task();
        Teacher02 teacher02 = new Teacher02();
        teacher02.task();
    }
}

运行结果:
在这里插入图片描述
我们观察上面的代码,虽然很好的完成了任务,但是,我们的四个实现类和和借口紧密的绑定到了一起,这意味着我们的代码耦合出现严重问题,不利于以后的维护,试想校长派发任务需要和老师接触,这肯定是一个不好的体验,那么我们就需要一个主任(俗称校长的gtz)来进行沟通,接下载创建主任:

package com.zzx.设计模式.工厂模式.简单工厂;

/**
 * @Author Zhengzx
 * @Date 2022/9/20 15:58
 * @Title 简单工厂
 * @Version 1.0
 */
public class Director {
    public static final int  SWEEP_THE_FLOOR = 1;
    public static final int  CLEAN_THE_WINDOWS = 2;
    public static final int  BUY_CIGARETTES = 3;

    public static School getMenu(int menuType){
        switch (menuType){
            case SWEEP_THE_FLOOR :
                return new Teacher01();
            case CLEAN_THE_WINDOWS:
                return new Teacher02();
            case BUY_CIGARETTES:
                return new Teacher03();
            default:
                return new Teacher04();
        }
    }
}

这样我们(也就是校长)就可以通过主任对老师派发任务了~~~

package com.zzx.设计模式.工厂模式.简单工厂;

/**
 * @Author Zhengzx
 * @Date 2022/9/20 16:15
 * @Title
 * @Version 1.0
 */
public class HeadMaster01 {
    public static void main(String[] args) {
        School school = Director.getMenu(Director.SWEEP_THE_FLOOR);
        school.task();
    }
}

在这里插入图片描述
这时候校长只需要通过调用getMenu()方法就可以给老师派发任务了

特点:
1.它是一个具体的类,非接口/抽象类.有一个重要的create(),利用if或者switch创建任务并返回;
2.create()方法通常是静态的,所以也称之为静态工厂
缺点:
1.扩展性差,假如我想添加一个开车的类,需要修改工厂类的方法;
2,不同的产品需要不同额外参数的时候不支持.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郑要做干饭人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值