Java设计模式之简单工厂

本文介绍简单工厂模式的设计理念,通过创建手机产品的实例演示其工作原理。简单工厂模式属于创建型模式,可简化客户端代码,但当新增产品时需修改工厂类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(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语句中增加新的分支来创建新的实例,这就是所谓的对修改开放了。那么如何消除这些缺点?请看简单工厂的进阶——工厂模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黄嘉成

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

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

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

打赏作者

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

抵扣说明:

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

余额充值