菜鸟之路:设计模式入门篇——简单工厂模式

简单工厂模式

1.什么是工厂?

用一个单独的类来做这个类创造实例的过程,这就是工厂。

2.它解决了那些问题?
简单工厂模式解决了对象的创建问题。

3.什么时候去使用简单工厂模式?

用于已知某些条件后,对类的选择,而这些类都是同一父类的子类。

 

计算器示例:

1.抽象一个基类(JiSuan),提供一个计算方法;

JiSuan类:

/**
 * 作者:LKP
 * 时间:2018/7/12
 * 计算器抽象类
 */
public abstract class JiSuan {
    private double numOne;
    private double numTwo;

    public double getNumOne() {
        return numOne;
    }

    public void setNumOne(double numOne) {
        this.numOne = numOne;
    }

    public double getNumTwo() {
        return numTwo;
    }

    public void setNumTwo(double numTwo) {
        this.numTwo = numTwo;
    }

    //计算结果
    public double JiSuan(){
        return 0d;
    }
}

2.创建两个子类基础该基类,分别是JiaFa子类和JianFa子类,同时实现计算结果方法;

JiaFa子类:

/**
 * 作者:LKP
 * 时间:2018/7/12
 * 加法类
 */
public class JiaFa extends JiSuan {

    @Override
    public double JiSuan() {
        return getNumOne()+getNumTwo();
    }
}

JianFa子类:

/**
 * 作者:LKP
 * 时间:2018/7/12
 * 减法类
 */
public class JianFa extends JiSuan {
    @Override
    public double JiSuan() {
        return getNumOne()-getNumTwo();
    }
}

3.创建一个计算工厂类(JiSuanFactory)

/**
 * 作者:LKP
 * 时间:2018/7/12
 * 计算工厂类
 */
public class JiSuanFactory {
    public static JiSuan createJiSuan(String yunSuanFu){
        JiSuan open = null;
        switch (yunSuanFu){
            case "+":
                open = new JiaFa();
                break;
            case "-":
                open = new JianFa();
                break;
        }
        return open;
    }
}

4.客户端代码

加法计算:

/**
 * 作者:LKP
 * 时间:2018/7/12
 */
public class MainClass {
    public static void main(String[] args){
        JiSuan jiSuan = JiSuanFactory.createJiSuan("+");
        jiSuan.setNumOne(10);
        jiSuan.setNumTwo(20);
        double number = jiSuan.JiSuan();
        System.out.println("计算结果为:"+number);
    }
}

运行结果:

减法计算:

/**
 * 作者:LKP
 * 时间:2018/7/12
 */
public class MainClass {
    public static void main(String[] args){
        JiSuan jiSuan = JiSuanFactory.createJiSuan("-");
        jiSuan.setNumOne(10);
        jiSuan.setNumTwo(20);
        double number = jiSuan.JiSuan();
        System.out.println("计算结果为:"+number);
    }
}

运行结果:

如果需要加入除法和乘法,只需新增一个除法子类和乘法子类,修改一下工厂类里面的switch选择器即可。

 

来看看这几个类的结构图:

 

优点:工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建那个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。

缺点:由于工厂类集中了所有实例的创建逻辑,这就直接导致一旦这个工厂出了问题,所有的客户端都会受到牵连;而且由于简单工厂模式的产品是基于一个共同的抽象类或者接口,这样一来,一旦产品的种类增加的时候,既有不同的产品接口或者抽象类的时候,工厂类就需要判断何时创建何种种类的产品,这就和创建何种种类的产品相互混淆在了一起,违背了单一职责,导致系统丧失灵活性和可维护行。而且更重要的是,简单工厂模式违背了“开发封闭原则”,就是违背了“系统对扩展开放,对修改关闭”的原则,因为当我新增加一个产品的时候必须修改工厂类,相应的工厂类就需要重新编译一遍。

 

 

 

编程是一门技术,更加是一门艺术!!!

 

 

 

 

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

良月柒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值