设计模式六大原则之简单工厂模式

  前言:不断学习就是程序员的宿命

一、概述

案例需求:一个手机的项目:要便于手机种类的扩展,便于维护

  (1)手机的种类很多(比如华为、小米、oppo等)

  (2)手机的制作(prepare,produce,box)

  (3)完成手机店订购的功能

二、传统模式

public class OrderPhone {
    // 构造器
    public OrderPhone() {
        Phone phone = null;
        String orderType; // 订购手机的类型
        do {
            orderType = getType();
            if (orderType.equals("xiaomi")) {
                phone = new XiaomiPhone();
                phone.setName(" 小米手机 ");
            } else if (orderType.equals("huawei")) {
                phone = new HuaweiPhone();
                phone.setName(" 华为手机 ");
            } else if (orderType.equals("pepper")) {
                phone = new OppoPhone();
                phone.setName("oppo手机");
            } else {
                break;
            }
            //输出pizza 制作过程
            phone.prepare();
            phone.produce();
            phone.box();

        } while (true);
    }
    // 写一个方法,可以获取客户希望订购的手机种类
    private String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input 手机 种类:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}
传统方式

分析:

  (1)优点:容易理解,简单易操作

  (2)缺点:违反了设计模式的OCP原则(对扩展开放,对修改关闭)当我们给类增加新功能的时候,尽量不修改代码或者尽可能少修改代码

  (3)例如此时要新增加一个手机种类(荣耀手机)则需要新增一个手机类,而且只要是订购手机的代码都要修改

三、简单工厂模式

  ①简单工厂模式属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单使用的模式。

  ②简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为

  ③在软件开发中,当我们会用到大量的创建某种、某类或某批对象时,就会使用到工厂模式。

  改进:基于传统模式修改,把创建Phone对象封装到一个类中,这样有新的手机类时只需要修改该类即可,其他有创建到Phone对象的代码就不用修改了,改进后的uml类图

public class SimpleFactory {
    //简单工厂模式 也叫 静态工厂模式

    public static Phone createPhone(String orderType) {

        Phone phone = null;

        System.out.println("使用简单工厂模式");
        if (orderType.equals("xiaomi")) {
            phone = new XiaomiPhone();
            phone.setName(" 小米手机 ");
        } else if (orderType.equals("huawei")) {
            phone = new HuaweiPhone();
            phone.setName(" 华为手机 ");
        } else if (orderType.equals("pepper")) {
            phone = new OppoPhone();
            phone.setName("oppo手机");
        }

        return phone;
    }
}
View Code

新的需求:

三、工厂方法模式

四、抽象工厂模式

猜你喜欢

转载自www.cnblogs.com/rmxd/p/12635635.html
今日推荐