Java23种设计模式--工厂模式

本文通过代码示例介绍了工厂模式(包括简单工厂、工厂方法和抽象工厂)在创建对象时的不同策略,强调了它们在解耦合和提高代码可维护性方面的作用。文章探讨了如何根据需求选择适当的设计模式,并指出设计模式选择应考虑软件的扩展性和架构。
摘要由CSDN通过智能技术生成

在23种设计模式有工厂模式和抽象工厂模式。其实我觉得没必要分开,可能是为了凑数。我在这篇博客就一起写了。工厂模式属于创建型模式不知道23种设计模式是如何分类的,去看我的单例模式讲解,那里面讲解了

  • 工厂模式其中有分类如下:
    1. 简单工厂
    2. 工厂方法
    3. 抽象工厂
  • 工厂模式:一个工厂对应一类产品,解决重复创建对象问题,直白点就是不用new,全靠这个工厂给我们对象。目的:维护对象方便,解耦合
  • 熟悉设计模式7大原则就知道工厂模式就是的最最核心就是依赖倒置原则:高层模块不应该依赖低层模块,它们都应该依赖抽象接口。抽象接口不应该依赖具体实现,具体实现应该依赖抽象接口。

1:需求

  • 为了贴近现实,就拿造车这个例子:我有一个詹姆斯车行,可以卖各种车

  • 以代码方式展现,传统写法:

    /**
     * 普通实现,所有的类都都写在内部类中最外面的相当于容器,方便观看
     * @author xxl
     * @date 2023/4/21
     */
    public  class Original {
        public static void main(String[] args) {
            JamesCarStone jamesCarStone = new JamesCarStone();
            System.out.println(jamesCarStone.sellingCar("汽车"));
            System.out.println(jamesCarStone.sellingCar("跑车"));
            System.out.println(jamesCarStone.sellingCar("新能源车"));
    
        }
        /**
         * 核心类
         */
        public abstract static class CarStone{
            abstract  String type();
        }
        public static class NewEnergyVehicles extends CarStone{
            @Override
            String type() {
                return "新能源车";
            }
        }
        public static class Automobile extends CarStone{
            @Override
            String type() {
                return "汽车";
            }
        }
        public static class JamesCarStone{
            public static final String NEW_ENERGY_VEHICLES = "新能源车";
            public static final String AUTOMOBILE = "汽车";
    
            public String sellingCar(String  carName){
                CarStone carStone = null;
                switch (carName) {
                    case NEW_ENERGY_VEHICLES -> carStone = new NewEnergyVehicles();
                    case AUTOMOBILE -> carStone = new Automobile();
                    default -> carStone = null;
                }
                return carStone == null ? carName + "暂时不在售" : "正在出售" + carStone.type();
            }
        }
    }
    
    

    UML类图

在这里插入图片描述

2:简单工厂

  • 也叫静态工厂,就是通过静态方法返回一个工厂对象

  • 核心思想:**创建对象 **

    /**
     * 简单工厂
     * @author xxl
     * @date 2023/4/21
     */
    public class SimpleFactoryPattern {
        public static void main(String[] args) {
            JamesCarStone jamesCarStone = new JamesCarStone(new CarStone());
            TomCarStone tomCarStone = new TomCarStone(new CarStone());
    
            System.out.println(jamesCarStone.sellingCar("跑车"));
            System.out.println(jamesCarStone.sellingCar("卡车"));
    
            System.out.println(tomCarStone.sellingCar("新能源车"));
            System.out.println(tomCarStone.sellingCar("汽车"));
    
        }
        
        public abstract static class Car{
            abstract  String type();
        }
        public static class NewEnergyVehicles extends Car {
            @Override
            String type() {
                return "新能源车";
            }
        }
        public static class Automobile extends Car {
            @Override
            String type() {
                return "汽车";
            }
        }
        public static class SportsCar extends Car {
            @Override
            String type() {
                return "跑车";
            }
        }
        /**
         * 核心类
         */
        public static class CarStone  {
            public static final String SPORTS_CAR = "跑车";
            public static final String AUTOMOBILE = "汽车";
            public static final String NEW_ENERGY_VEHICLES = "新能源车";
            public String queryCar(String  carName){
                Car carStone = null;
                switch (carName) {
                    case NEW_ENERGY_VEHICLES -> carStone = new NewEnergyVehicles();
                    case AUTOMOBILE -> carStone = new Automobile();
                    case SPORTS_CAR -> carStone = new SportsCar();
                    default -> carStone = null;
                }
                return carStone == null ? carName + "暂时不在售" : "正在出售" + carStone.type();
            }
        }
    
        public static class JamesCarStone{
            CarStone carStone = null;
    
            public JamesCarStone(CarStone carStone) {
                this.carStone = carStone;
            }
    
            public String sellingCar(String carName){
                return carStone.queryCar(carName);
            }
        }
        public static class TomCarStone{
            CarStone carStone = null;
    
            public TomCarStone(CarStone carStone) {
                this.carStone = carStone;
            }
    
            public String sellingCar(String carName){
                return carStone.queryCar(carName);
            }
        }
    }
    

UML类图

在这里插入图片描述

3:工厂方法

  • 核心思想是:对象的实例化在子类中

    /**
     * 工厂方法类
     * @author xxl
     * @date 2023/4/21
     */
    public class FactoryMethod {
        public static void main(String[] args) {
            JamesCarStone jamesCarStone = new JamesCarStone(new NewEnergyVehiclesCarFactory());
            TomCarStone tomCarStone = new TomCarStone(new AutomobileCarFactory());
    
            System.out.println(jamesCarStone.sellingCar("特斯拉"));
            System.out.println(jamesCarStone.sellingCar("卡车"));
    
            System.out.println(tomCarStone.sellingCar("宝马"));
            System.out.println(tomCarStone.sellingCar("汽车"));
    
        }
        public interface  Car {
            String type();
        }
    
        public static class BYD implements Car{
            @Override
            public String type() {
                return "比亚迪";
            }
        }
        public static class Tesia implements Car{
            @Override
            public String type() {
                return "特斯拉";
            }
        }
        public static class BWM implements Car{
            @Override
            public String type() {
                return "宝马";
            }
        }
        public static class Lamborghini implements Car{
            @Override
            public String type() {
                return "兰博基尼";
            }
        }
    
        public static  class NewEnergyVehiclesCarFactory extends CarStone{
    
            @Override
            public String queryCar(String carName) {
                Car car = null;
                if ("特斯拉".equals(carName)) {
                    car = new Tesia();
                }else if ("比亚迪".equals(carName)){
                    car = new BYD();
                }
                return car == null ? carName+"当前品牌不在出售":"正在出售:"+car.type();
            }
        }
        public static  class AutomobileCarFactory extends CarStone{
            @Override
            public String queryCar(String carName) {
                Car car = null;
                if ("宝马".equals(carName)) {
                    car = new BWM();
                }
                return car == null ? carName+"当前品牌不在出售":"正在出售:"+car.type();
            }
        }
        public static  class SportsCarFactory extends CarStone{
            @Override
            public String queryCar(String carName) {
                Car car = null;
                if ("兰博基尼".equals(carName)) {
                    car = new Lamborghini();
                }
                return car == null ? carName+"当前品牌不在出售":"正在出售:"+car.type();
            }
        }
    
        public static abstract class CarStone{
            public abstract String queryCar(String carName);
        }
    
        public static class JamesCarStone{
            CarStone carStone = null;
    
            public JamesCarStone(CarStone carStone) {
                this.carStone = carStone;
            }
    
            public String sellingCar(String carName){
                return carStone.queryCar(carName);
            }
        }
        public static class TomCarStone{
            CarStone carStone = null;
    
            public TomCarStone(CarStone carStone) {
                this.carStone = carStone;
            }
    
            public String sellingCar(String carName){
                return carStone.queryCar(carName);
            }
        }
    }
    

    UML图

在这里插入图片描述

4:抽象工厂

  • **核心思想:**通过定义一个接口(抽象工厂),所有的小工厂去实现这个接口。通过这个接口就可以返回各种小工厂

  • 抽象工厂模式有两层:

    1. 抽象工厂
    2. 工厂子类
    package src.java_23_design_modes.creationmode.FactoryPattern;
    
    /**
     * 抽象工厂
     * @author xxl
     * @date 2023/4/21
     */
    public class AbstractFactory {
        public static void main(String[] args) {
            JamesCarStone jamesCarStone = new JamesCarStone(new CarStone());
            TomCarStone tomCarStone = new TomCarStone(new CarStone());
    
            System.out.println(jamesCarStone.sellingCar("特斯拉"));
            System.out.println(jamesCarStone.sellingCar("卡车"));
    
            System.out.println(tomCarStone.sellingCar("宝马"));
            System.out.println(tomCarStone.sellingCar("汽车"));
        }
        public interface Car{String type();}
        public interface CarFactory{
            Car createCar(String carName);
    
            String get();
        }
        public static class BYD implements Car {
            @Override
            public String type() {
                return "比亚迪";
            }
        }
        public static class Tesia implements Car {
            @Override
            public String type() {
                return "特斯拉";
            }
        }
        public static class BWM implements Car {
            @Override
            public String type() {
                return "宝马";
            }
        }
        public static class Lamborghini implements Car {
            @Override
            public String type() {
                return "兰博基尼";
            }
        }
        public static  class NewEnergyVehiclesCarFactory implements CarFactory {
            String batteryVariety;
    
            public void setBatteryVariety(String batteryVariety) {
                this.batteryVariety = batteryVariety;
            }
    
            @Override
            public Car createCar(String carName) {
                Car car = null;
                if ("特斯拉".equals(carName)) {
                    car = new Tesia();
                    setBatteryVariety("电池型号:18650 型钴酸锂离子电池");
                } else if ("比亚迪".equals(carName)) {
                    car = new BYD();
                    setBatteryVariety("电池型号:LFP(磷酸铁锂)电池");
                }
    
                return car;
            }
            @Override
            public String get() {
                return batteryVariety;
            }
        }
        public static  class AutomobileCarFactory implements CarFactory {
            String gasolineModel;
    
            public void setGasolineModel(String gasolineModel) {
                this.gasolineModel = gasolineModel;
            }
    
            @Override
            public Car createCar(String carName) {
                Car car = null;
                if ("宝马".equals(carName)) {
                    car = new BWM();
                    setGasolineModel("汽油种类:92");
                }
                return car;
            }
            @Override
            public String get() {
                return gasolineModel;
            }
        }
        public static  class SportsCarFactory implements CarFactory {
            String engineModel;
    
            public void setEngineModel(String engineModel) {
                this.engineModel = engineModel;
            }
    
            @Override
            public Car createCar(String carName) {
                Car car = null;
                if ("兰博基尼".equals(carName)) {
                    car = new Lamborghini();
                    setEngineModel("V12发动机");
                }
                return car;
            }
            @Override
            public String get() {
                return engineModel;
            }
        }
        public static  class CarStone{
    
            public  String queryCar(String carName){
                CarFactory automobileCarFactory = getAutomobileCarFactory();
                CarFactory newEnergyVehiclesCarFactory = getNewEnergyVehiclesCarFactory();
                CarFactory sportsCarFactory = getSportsCarFactory();
    
                Car car1 = automobileCarFactory.createCar(carName);
                Car car2 = newEnergyVehiclesCarFactory.createCar(carName);
                Car car3 = sportsCarFactory.createCar(carName);
    
                if (car1 != null) {
                    return "正在出售"+car1.type()+automobileCarFactory.get();
                }
                if (car2 != null) {
                    return "正在出售"+car2.type()+newEnergyVehiclesCarFactory.get();
                }
                if (car3 != null) {
                    return "正在出售"+car3.type()+sportsCarFactory.get();
                }
                return carName+"此车不在出售";
            }
    
            private CarFactory getAutomobileCarFactory() {
                return new AutomobileCarFactory();
            }
            private CarFactory getNewEnergyVehiclesCarFactory() {
                return new NewEnergyVehiclesCarFactory();
            }
            private CarFactory getSportsCarFactory() {
                return new SportsCarFactory();
            }
        }
    
        public static class JamesCarStone{
            CarStone carStone = null;
    
            public JamesCarStone(CarStone carStone) {
                this.carStone = carStone;
            }
    
            public String sellingCar(String carName){
                return carStone.queryCar(carName);
            }
        }
        public static class TomCarStone{
            CarStone carStone = null;
    
            public TomCarStone(CarStone carStone) {
                this.carStone = carStone;
            }
    
            public String sellingCar(String carName){
                return carStone.queryCar(carName);
            }
        }
    
    }
    

    UML类图

在这里插入图片描述

5:总结

  • 简单工厂 --> 工厂方法 --> 抽象工厂,从以上案例还不难看出越到后面类与类之间越来越复杂,用的模式也越来越难懂。就是说设计一个软件,初期就需要考虑它的架构和扩展性,不是说一上来就用最难的技术。而是根据情况选择,往往一个好的软件扩展性肯定不差
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值