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 开发中有着广泛的应用。通过合理地运用工厂模式,我们能够提高代码的灵活性、可维护性和可扩展性

相关推荐
岳轩子1 小时前
23种设计模式之原型模式
设计模式·原型模式
十五年专注C++开发1 小时前
C++中的链式操作原理与应用(一)
开发语言·c++·设计模式
旺代4 小时前
C++设计模式(单例模式)
c++·单例模式·设计模式
LightOfNight4 小时前
【设计模式】创建型模式之单例模式(饿汉式 懒汉式 Golang实现)
单例模式·设计模式·golang
那年星空13 小时前
Flutter 设计模式全面解析:抽象工厂
flutter·设计模式·架构
博风14 小时前
设计模式:10、外观模式
设计模式·外观模式
你好helloworld16 小时前
设计模式之观察者模式
观察者模式·设计模式
zzzhpzhpzzz20 小时前
设计模式——抽象工厂模式
设计模式·抽象工厂模式
阳光开朗_大男孩儿21 小时前
组合设计模式
c++·设计模式·组合模式·组合设计模式
编程、小哥哥1 天前
设计模式之代理模式(模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景)
设计模式·mybatis·代理模式