【简单理解什么是简单工厂、工厂方法与抽象工厂模式】

一、简单工厂模式

1.简单工厂模式 通过一个工厂类集中管理对象的创建 ,通过参数决定具体创建哪个对象。

#适合对象类型较少且变化不频繁的场景,缺点是违反开闭原则(新增产品需修改工厂类)

开闭原则(对扩展开放‌+对修改关闭‌) :当有新的需求或变化时,可以通过增加新的模块或功能来扩展软件实体的行为,而不需要修改现有的代码。;软件实体一旦被创建并投入使用,其内部实现应该保持稳定,不应轻易修改。

  1. 实现步骤:
    定义产品接口------>实现具体产品类------>创建工厂类------>通过参数控制对象创建

示例代码:

java 复制代码
// 1. 定义产品接口
interface Car {
    void drive();
}

// 2. 具体产品实现
class Tesla implements Car {
    @Override
    public void drive() {
        System.out.println("Driving Tesla!");
    }
}

class BMW implements Car {
    @Override
    public void drive() {
        System.out.println("Driving BMW!");
    }
}

// 3. 使用枚举优化参数
enum CarType {
    TESLA, BMW
}

class CarFactory {
    public static Car createCar(CarType type) {
        switch (type) {
            case TESLA:
                return new Tesla();
            case BMW:
                return new BMW();
            default:
                throw new IllegalArgumentException("Unknown car type!");
        }
    }
}

// 4. 使用
public class Main {
    public static void main(String[] args) {
        Car tesla = CarFactory.createCar(CarType.TESLA);
        tesla.drive(); // Driving Tesla!
        Car bmw = CarFactory.createCar(CarType.BMW);
        bmw.drive(); // Driving BMW!
    }
}

二、工厂方法模式

  1. 工厂方法模式通过定义一个抽象工厂接口,由子类(具体工厂)决定创建哪个具体产品。符合开闭原则,新增产品只需新增工厂类,无需修改原有代码。
  2. 扩展性强,新增产品类型时只需添加新工厂和产品类。解耦客户端与具体产品,客户端只需依赖抽象工厂接口。
  3. 工厂方法模式的实现步骤:定义产品接口------>定义产品的具体实现类,让其实现"产品接口"并重写"产品接口方法"------>定义产品的工厂接口------>定义产品具体的工厂类,让其实"现工厂接口"并重写"工厂接口方法"------>在使用的时候需要创建不同产品的工厂类对象,然后调用他们重写后的接口方法来创建对象。

示例代码

java 复制代码
// 1. 定义产品接口
interface Phone {
    void call();
}

// 2. 具体产品实现
class iPhone implements Phone {
    @Override
    public void call() {
        System.out.println("Calling with iPhone!");
    }
}

class Samsung implements Phone {
    @Override
    public void call() {
        System.out.println("Calling with Samsung!");
    }
}

// 3. 定义工厂接口
interface PhoneFactory {
    Phone createPhone();
}

// 4. 具体工厂实现
class iPhoneFactory implements PhoneFactory {
    @Override
    public Phone createPhone() {
        return new iPhone();
    }
}

class SamsungFactory implements PhoneFactory {
    @Override
    public Phone createPhone() {
        return new Samsung();
    }
}

// 5. 使用
public class Main {
    public static void main(String[] args) {
        PhoneFactory iphoneFactory = new iPhoneFactory();
        Phone iphone = iphoneFactory.createPhone();
        iphone.call(); // Calling with iPhone!
        
        PhoneFactory samsungFactory = new SamsungFactory();
        Phone samsung = samsungFactory.createPhone();
        samsung.call(); // Calling with Samsung!
    }
}

三、抽象工厂模式

  1. 抽象工厂模式用于创建一组相关或依赖的对象(如不同品牌的手机 + 耳机)。适用于产品族的创建,而不是单个产品。

  2. 定义与特点
    定义 :抽象工厂模式用于创建一组相关或依赖的对象(如不同品牌的手机 + 耳机)。
    适用场景 :需要创建"产品族"的场景(如苹果全家桶、三星全家桶)。
    核心思想:抽象工厂接口定义多个工厂方法,每个方法对应一个产品类型。

  3. 实现步骤

    定义产品族接口(如Phone和Earphones)------>实现具体产品类(分属不同产品族)------>定义抽象工厂接口,包含多个工厂方法------> 实现具体工厂类,为每个产品族提供创建逻辑

示例代码:

java 复制代码
// 1. 定义产品族接口
interface Phone {
    void call();
}

interface Earphones {
    void listen();
}

// 2. 具体产品实现(苹果产品族)
class iPhone implements Phone {
    @Override
    public void call() {
        System.out.println("Calling with iPhone!");
    }
}

class AirPods implements Earphones {
    @Override
    public void listen() {
        System.out.println("Listening with AirPods!");
    }
}

// 3. 具体产品实现(三星产品族)
class SamsungPhone implements Phone {
    @Override
    public void call() {
        System.out.println("Calling with Samsung!");
    }
}

class SamsungEarphones implements Earphones {
    @Override
    public void listen() {
        System.out.println("Listening with Samsung Earphones!");
    }
}

// 4. 定义抽象工厂接口
interface TechFactory {
    Phone createPhone();
    Earphones createEarphones();
}

// 5. 具体工厂实现(苹果工厂)
class AppleFactory implements TechFactory {
    @Override
    public Phone createPhone() {
        return new iPhone();
    }

    @Override
    public Earphones createEarphones() {
        return new AirPods();
    }
}

// 6. 具体工厂实现(三星工厂)
class SamsungFactory implements TechFactory {
    @Override
    public Phone createPhone() {
        return new SamsungPhone();
    }

    @Override
    public Earphones createEarphones() {
        return new SamsungEarphones();
    }
}

// 7. 使用
public class Main {
    public static void main(String[] args) {
        TechFactory appleFactory = new AppleFactory();
        appleFactory.createPhone().call();      // Calling with iPhone!
        appleFactory.createEarphones().listen(); // Listening with AirPods!
        
        TechFactory samsungFactory = new SamsungFactory();
        samsungFactory.createPhone().call();      // Calling with Samsung!
        samsungFactory.createEarphones().listen(); // Listening with Samsung Earphones!
    }
}

四、模式对比与疑问解答

  1. 工厂方法模式中选择接口而非抽象类的原因
    答案:
    灵活性更高:接口支持多实现,Java 不支持多继承,但类可实现多个接口。抽象类可能包含默认实现,限制子类灵活性。
    符合开闭原则:新增产品(如 Xiaomi)只需添加新具体产品类和对应工厂类,无需修改原有代码。
    设计意图契合:工厂方法模式的核心是定义"创建对象的接口",而接口仅定义方法签名,不提供具体实现。
  2. 三种模式的核心区别
特性 简单工厂模式 工厂方法模式 抽象工厂模式
创建对象类型 单一产品的不同实现(不同汽车) 单一产品的不同实现(不同手机) 一组相关产品(手机 + 耳机)
工厂结构 单一工厂类(静态方法) 抽象工厂接口 + 具体工厂类 抽象工厂接口 + 具体工厂类
工厂方法数量 1 个(createCar) 1 个(createPhone) 多个(如 createPhone 和 createEarphones)
扩展性 新增产品需修改工厂类 新增产品只需添加新工厂类 新增产品族需添加新工厂类
是否符合开闭原则 不符合 符合 符合
相关推荐
YYYing.5 小时前
【设计模式系列 (五) 】原型模式
开发语言·后端·设计模式·原型模式·c/c++
TeamDev5 小时前
JxBrowser 9.5.2 版本发布啦!
java·前端·windows·chromium·混合应用·jxbrowser·浏览器控件
重生之小比特5 小时前
【C++进阶】哈希表实现
开发语言·c++·哈希
鬼手点金5 小时前
Claude Code示范案例-进阶学习路径
java·服务器·前端·学习·计算机视觉·前向传播
浪子明X5 小时前
用 CMake Presets 固定跨平台构建:从本地开发到 CI 的依赖一致性实践
java·spring·ci/cd
m0_380743875 小时前
VisualStudio中OpenCV的创建与配置使用小结
开发语言·c++
苏supper5 小时前
记一次Nacos鉴权报错unknown user,403排查|SecurityProxy源码,fastjson2扩展包缺失
java·后端
\光辉岁月/5 小时前
6.mybatisplus学习-BaseMapper、Service、常用注解
java·mybatis·mybatisplus
微信开发api5 小时前
基于WTAPI构建社群运营平台:自动拉群与会话承接链路设计
java·大数据·网络·数据库·微信·自动化
凉茶钱5 小时前
【C++】动态内存管理完整解析:从内存划分到 new delete 底层原理
c语言·开发语言·c++·内存管理·动态内存