Java设计模式之简单工厂

前言

从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

简单工厂

我们可以设想这样一个场景,手机生产厂家和用户,用户并不需要知道手机厂家生产手机产品的具体过程,用户只需要告诉厂家需要什么手机产品,生产过程由厂家负责。

我们先定义手机产品的接口:

Phone.java

public interface Phone {
    void show(); // 输出手机的信息
}

接下来定义iPhone手机和WindowsPhone手机的具体产品

iPhone.java

public class iPhone implements Phone {

    String brand; // 品牌
    String os;    // 操作系统
    int storage;  // 容量

    public iPhone() {
        this.brand = "Apple";
        this.storage = 64;
        this.os = "iOS";
    }

    @Override
    public void show() {
        System.out.println("品牌为:" + brand + ",操作系统为:" + os + ",容量为:" + storage + "GB");
    }
}

WindowsPhone.java

public class WindowsPhone implements Phone {

    String brand; // 品牌
    String os;    // 操作系统
    int storage;  // 容量

    public WindowsPhone() {
        this.brand = "WindowsPhone";
        this.storage = 32;
        this.os = "windows";
    }


    @Override
    public void show() {
        System.out.println("品牌为:" + brand + ",操作系统为:" + os + ",容量为:" + storage + "GB");
    }
}

最后定义生产厂家

Factory.java

public class Factory {

    // 用户只需告诉厂家需要什么手机,厂家就会执行具体的创建过程
    public static Phone produce(String name) {
        if ("WP".equals(name)) {
            return new WindowsPhone();
        } else if ("iPhone".equals(name)) {
            return new iPhone();
        } else {
            return null;
        }
    }
}

最后看看客户端调用代码:

Main.java

public class Main {

    public static void main(String[] args) {
        Phone phone = Factory.produce("iPhone"); // 生产iPhone手机
        phone.show(); // 输出手机产品信息
        phone = Factory.produce("WP"); // 生产WindowsPhone手机
        phone.show(); // 输出手机产品信息
    }
}

用户需要什么手机,直接告诉厂家即可。这里是通过字符串传值,由写错单词的风险,可以改进成使用枚举类型的参数,这里直接给出优化后的代码:

Factory.java

// 改进后的工厂类
public class Factory {
    enum type {iPhone, WindowsPhone}

    public static Phone produce(type name) {
        if (type.WindowsPhone.equals(name)) {
            return new WindowsPhone();
        } else if (type.iPhone.equals(name)) {
            return new iPhone();
        } else {
            return null;
        }
    }
}

Main.java

// 改进后的客户端调用代码
public class Main {

    public static void main(String[] args) {
        Phone phone = Factory.produce(Factory.type.iPhone);
        phone.show();
        phone = Factory.produce(Factory.type.WindowsPhone);
        phone.show();
    }
}

总结

简单工厂可以使调用方创建具体实例的过程,将具体创建过程交给工厂类来完成。但是简单工厂模式的缺点很明显,就是没有满足开闭原则,每当新增一个产品,都需要修改工厂类的代码,往if-else语句中增加新的分支来创建新的实例,这就是所谓的对修改开放了。那么如何消除这些缺点?请看简单工厂的进阶——工厂模式

猜你喜欢

转载自blog.csdn.net/qq_33829547/article/details/81043596