Java设计模式:工厂模式

什么是工厂模式?

工厂模式属于创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们不会直接实例化对象,而是通过工厂来创建所需的对象。这样做的好处之一是将对象的创建和使用分离,使代码更易于维护和扩展。

工厂模式的类型

简单工厂模式

简单工厂模式是最基本的工厂模式之一,我们通过下一个简单例子结合解释

typescript 复制代码
/**
 * 手机
 * @author LGC
 */
public interface Phone {
    void call();
}

/**
 * 华为手机
 * @author LGC
 */
public class HuaWeiPhone implements Phone {
    @Override
    public void call() {
        System.out.println("用华为手机打电话");
    }
}

/**
 * 小米手机
 * @author LGC
 */
public class XiaomiPhone implements Phone {
    @Override
    public void call() {
        System.out.println("用小米手机打电话");
    }
}

/**
 * 简单工厂模式
 * 单一职责,开闭原则,接口隔离原则,里氏替换原则,迪米特法则,依赖倒置原则
 * @author LGC
 */
public class SimplePhoneFactory {

    public Phone create(String type) {
        if (type.equals("huawei")) {
            return new HuaWeiPhone();
        } else {
            return new XiaomiPhone();
        }
    }
}

/**
 * 通过简单工厂获取小米手机
 */
@Test
public void simpleFactory() {
    PhoneFactory phoneFactory = new PhoneFactory();
    Phone phone = phoneFactory.create("xiaomi");
    phone.call();
}

通过代码可知,该手机工厂可以生产不同品牌手机(小米和华为品牌手机),假如需要生产三星品牌的手机,则需要修改工厂类 SimplePhoneFactory 类,显然这就违反了开闭原则。在我们的使用过程中,如果是单一的固定几个品牌(类型,种类等等),而且后期不会新增,我们可以使用简单工厂模式进行创建一个对象。

工厂方法模式

通过上面代码我们知道,假如我们需要生产其它品牌的手机就需要修改工厂类,那我们有没有办法做到不修改工厂类,其实我们可以改造成工厂方法模式,不同的品牌手机使用不同品牌手机工厂,我们改造一下手机工厂类,创建不同品牌的工厂

typescript 复制代码
/**
 * 工厂方法

 * 手机工厂
 * 将不同品牌手机工厂拆分为不同工厂
 * 如需生产三星手机,新建一个三星品牌手机工厂
 * @author LGC
 */
public interface PhoneFactory {
    Phone create();
}


/**
 * 小米品牌手机工厂
 *
 * @author LGC
 */
public class XiaomiPhoneFactory implements PhoneFactory {

    @Override
    public Phone create() {
        return new XiaomiPhone();
    }
}

/**
 * 华为品牌手机工厂
 *
 * @author LGC
 */
public class HuaweiPhoneFactory implements PhoneFactory {

    @Override
    public Phone create() {
        return new HuaWeiPhone();
    }
}

// 假如我们还要创建新的品牌手机只需要添加一个品牌手机工厂如:

/**
 * 三星品牌手机工厂
 *
 * @author LGC
 */
public class SanxingPhoneFactory implements PhoneFactory {

    @Override
    public Phone create() {
        return new SanxingPhone();
    }
}

/**
 * 通过工厂方法获取华为手机工厂,然后创建手机
 */
@Test
public void methodFactory() {
      PhoneFactory phoneFactory = new HuaweiPhoneFactory();
      Phone phone = phoneFactory.create();
      phone.call();
}

工厂方法模式引入了抽象工厂接口,每个具体的产品都有对应的工厂类来创建。这样可以实现不同产品的独立扩展,符合开闭原则。

抽象工厂模式

我们观察到上面的工厂方法模式,只能创建某个产品对应的工厂,假如我有一个超级工厂,该工厂不仅可以创建手机产品,也能创建电脑、电视等一系列产品族,那我们该如何创建我们的工厂呢?其实我们可以把每个产品的工厂抽象出来,交给超级工厂来统一管理。比如下面一个超级工厂不仅生产手机也可以生产电脑

java 复制代码
/**
 * @author LGC
 * @date 2023/8/10 14:07
 */
public interface Compute {

    /**
     * 上网
     */
    void online();
}
/**
 * @author LGC
 */
public class HuaWeiCompute implements Compute {
    @Override
    public void online() {
        System.out.println("用华为电脑上网");
    }
}
/**
 * @author LGC
 */
public class XiaomiCompute implements Compute {
    @Override
    public void online() {
        System.out.println("用小米电脑上网");
    }
}

/**
 * 工厂方法
 * <p>
 * 电脑工厂
 * 将不同品牌电脑工厂拆分为不同工厂
 * 如需生产三星电脑,新建一个三星品牌电脑
 *
 * @author LGC
 */
public interface ComputeFactory {

    Compute create();

}
/**
 * 华为品牌电脑工厂
 *
 * @author LGC
 */
public class HuaweiComputeFactory implements ComputeFactory {

    @Override
    public Compute create() {
        return new HuaWeiCompute();
    }
}

/**
 * 小米品牌电脑工厂
 *
 * @author LGC
 */
public class XiaomiComputeFactory implements ComputeFactory {

    @Override
    public Compute create() {
        return new XiaomiCompute();
    }
}

/**
 * 抽象工厂-超级工厂,不仅可以生产手机,也可以生产电脑
 * <p>
 * 手机工厂
 * 电脑工厂
 * 还可其它产品,如耳机,电池等等
 * <p>
 * 可以把不同产品同一品牌的放在品牌族里
 *
 * @author LGC
 */
public interface Factory {

    /**
     * 手机工厂
     *
     * @return
     */
    PhoneFactory createPhoneFactory();

    /**
     * 电脑工厂
     *
     * @return
     */
    ComputeFactory createComputeFactory();

}

/**
 * 华为品牌族工厂
 *
 * @author LGC
 */
public class HuaweiFactory implements Factory {

    /**
     * 华为手机工厂
     *
     * @return
     */
    @Override
    public PhoneFactory createPhoneFactory() {
        return new HuaweiPhoneFactory();
    }

    /**
     * 华为电脑工厂
     *
     * @return
     */
    @Override
    public ComputeFactory createComputeFactory() {
        return new HuaweiComputeFactory();
    }

}

/**
 * 小米品牌族工厂
 *
 * @author LGC
 */
public class XiaomiFactory implements Factory {

    /**
     * 小米手机工厂
     *
     * @return
     */
    @Override
    public PhoneFactory createPhoneFactory() {
        return new XiaomiPhoneFactory();
    }

    /**
     * 小米电脑工厂
     *
     * @return
     */
    @Override
    public ComputeFactory createComputeFactory() {
        return new XiaomiComputeFactory();
    }

}

 @Test
 public void abstractFactory() {
     //华为品牌族
     Factory factory = new HuaweiFactory();
     PhoneFactory phoneFactory = factory.createPhoneFactory();
     Phone phone = phoneFactory.create();
     phone.call();

    ComputeFactory computeFactory = factory.createComputeFactory();
    Compute compute = computeFactory.create();
    compute.online();

    //小米品牌族
    factory = new XiaomiFactory();
    phoneFactory = factory.createPhoneFactory();
    phone = phoneFactory.create();
    phone.call();

    computeFactory = factory.createComputeFactory();
    compute = computeFactory.create();
    compute.online();

}

抽象工厂模式是工厂方法模式的扩展,它通过提供一个创建一系列相关或相互依赖对象的接口,实现了一组产品族的创建。

结语

工厂模式是面向对象编程中极为重要的设计模式之一,在 Java 开发中有着广泛的应用。通过合理地运用工厂模式,我们能够提高代码的灵活性、可维护性和可扩展性

相关推荐
wrx繁星点点1 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
金池尽干3 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨3 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉12 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点12 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰12 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus12 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵12 小时前
设计模式-迭代器
设计模式
lexusv8ls600h14 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
sniper_fandc17 小时前
抽象工厂模式
java·设计模式·抽象工厂模式