非官方解读工厂模式

本文深入解析工厂模式,包括简单工厂、普通工厂及抽象工厂模式。通过示例代码详细阐述每种模式的原理、优缺点及应用场景,助您掌握工厂模式精髓。

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

工厂方法模式其中包含两种,这里就写在一起了,包含普通工厂模式和抽象方法模式,工厂模式可以在一定程度上减少coding,只能是一定程度上.因为我们在使用中往往会增加coding.它最明显的好处是代码隔离,复用,解耦.可以理解为我们将复杂的对象的实例化放在工厂模式中进行处理,在使用时工厂模式透明,我们不需要去关心内部如何实现.而解耦则是我们在进行编程时不会进行强制的指向,即通过工厂模式作为统一入口来获取实例即可.作者是个二吊子,如果描述有误请指出.


工厂模式的种类

本文描述三种,含简单工厂模式,普通工厂模式,抽象工厂模式.需要注意简单工厂模式未列入二十三种设计模式中

简单工厂模式(非23种之一,算不上)

uml图
简单工厂uml

我们产品抽象是车-Car,其中实现有燃气车GasCar,燃油车OilCar两种.实现了Car中的行为.SimpleFactory为工厂类,提供了获取实例的方法,通过参数进行控制获取的具体实例.以下为代码

/**
 * @Description: 抽象类,抽象了产品的行为.这里使用了抽象类,用接口也可以,并无不妥,只是可能受到单根继承的影响,此处为简单示例
 * @Author: gaofan
 * @Date: 2020/3/20 10:35
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public abstract class Car {

    // 运行
    public abstract void run();
    // 开窗
    public abstract void openWindow();
    // 停车
    public abstract void stop();

}
/**
 * @Description: 继承了Car,实现了其行为
 * @Author: gaofan
 * @Date: 2020/3/20 10:40
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class GasCar extends Car {

    public void run() {
        System.out.println("燃气车运行了...");
    }

    public void openWindow() {
        System.out.println("燃气车开窗了...");
    }

    public void stop() {
        System.out.println("燃气车停止了...");
    }
}
/**
 * @Description: 继承了Car,实现了其行为
 * @Author: gaofan
 * @Date: 2020/3/20 10:39
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class OilCar extends Car{

    public void run() {
        System.out.println("燃油车运行了...");
    }

    public void openWindow() {
        System.out.println("燃油车开窗了...");
    }

    public void stop() {
        System.out.println("燃油车停止了...");
    }
}
/**
 * @Description: 简单工厂或者叫静态工厂模式
 * @Author: gaofan
 * @Date: 2020/3/20 11:04
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class SimpleFactory {

    public static Car getCar(String car) {
        if ("gas".equals(car)) {
            return new GasCar();
        } else if ("oil".equals(car)) {
            return new OilCar();
        } else {
            return null;
        }
    }
}

类型: 简单工厂模式
原理: 以入参来限定工厂方法返回类型,使用工厂模式可以减少代码维护量.但是这里会出现问题,我们在新增产品时就必须要改动工厂类并新增实体.就违反了开闭原则了.不建议使用

普通工厂模式

为每一个产品构造一个工厂类,用来创建,普通工厂模式是创造一种产品.
uml图
普通工厂uml

为每一个产品提供一个工厂类.使用时根据多态.

/**
 * @Description: 抽象类
 * @Author: gaofan
 * @Date: 2020/3/20 10:35
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public abstract class Car {

    // 运行
    public abstract void run();
    // 开窗
    public abstract void openWindow();
    // 停车
    public abstract void stop();

}
/**
 * @Description: 燃油车
 * @Author: gaofan
 * @Date: 2020/3/20 10:39
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class OilCar extends Car{

    public void run() {
        System.out.println("燃油车运行了...");
    }

    public void openWindow() {
        System.out.println("燃油车开窗了...");
    }

    public void stop() {
        System.out.println("燃油车停止了...");
    }
}
/**
 * @Description: 燃气车
 * @Author: gaofan
 * @Date: 2020/3/20 10:40
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class GasCar extends Car {

    public void run() {
        System.out.println("燃气车运行了...");
    }

    public void openWindow() {
        System.out.println("燃气车开窗了...");
    }

    public void stop() {
        System.out.println("燃气车停止了...");
    }
}
/**
 * @Description: 工厂根类
 * @Author: gaofan
 * @Date: 2020/3/20 16:20
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public interface Factory {

    Car create();

}
/**
 * @Description: 燃气车工厂类
 * @Author: gaofan
 * @Date: 2020/3/20 16:20
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class GasCarFactory implements Factory {
    public Car create() {
        return new GasCar();
    }
}
/**
 * @Description: 燃油车工厂类
 * @Author: gaofan
 * @Date: 2020/3/20 16:21
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class OilCarFactory implements Factory {

    public Car create() {
        return new OilCar();
    }
}

类型: 普通工厂模式
原理: 为每一个产品创建一个工厂类,解决了简单工厂中违背开闭原则的情况.我们在后续如果需要新增一个产品,只需要创建产品类即工厂类即可.
缺点: 编码会增多

抽象工厂模式

普通工厂模式是创建一种产品,而抽象工厂则是一类,进行了归集.可以理解为产品簇使用场景.
抽象工厂uml

便于我们在复杂的产品层级中使用,新增一类产品时,我们只需要继承工厂类,新增产品即可.这里需要注意的是,如果工厂抽象类中的方法不够通用则可以下沉,如果还有其他通用方法也可以提升到抽象类中.灵活使用

/**
 * @Description: 抽象类,这是整体的抽象,最基本的抽象
 * @Author: gaofan
 * @Date: 2020/3/20 10:35
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public abstract class Car {

    // 运行
    public abstract void run();
    // 开窗
    public abstract void openWindow();
    // 停车
    public abstract void stop();

}
/**
 * @Description: 载物燃气车
 * @Author: gaofan
 * @Date: 2020/3/20 10:40
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class CargoGasCar extends Car {

    public void run() {
        System.out.println("载物燃气车运行了...");
    }

    public void openWindow() {
        System.out.println("载物燃气车开窗了...");
    }

    public void stop() {
        System.out.println("载物燃气车停止了...");
    }
}
/**
 * @Description: 载物燃油车
 *
 * @Author: gaofan
 * @Date: 2020/3/20 10:39
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class CargoOilCar extends Car {

    public void run() {
        System.out.println("载物燃油车运行了...");
    }

    public void openWindow() {
        System.out.println("载物燃油车开窗了...");
    }

    public void stop() {
        System.out.println("载物燃油车停止了...");
    }
}
/**
 * @Description: 载人燃气车
 * @Author: gaofan
 * @Date: 2020/3/20 10:40
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class MannedGasCar extends Car {

    public void run() {
        System.out.println("载人燃气车运行了...");
    }

    public void openWindow() {
        System.out.println("载人燃气车开窗了...");
    }

    public void stop() {
        System.out.println("载人燃气车停止了...");
    }
}
/**
 * @Description: 载人燃油车
 * @Author: gaofan
 * @Date: 2020/3/20 10:39
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class MannedOilCar extends Car {

    public void run() {
        System.out.println("载人燃油车运行了...");
    }

    public void openWindow() {
        System.out.println("载人燃油车开窗了...");
    }

    public void stop() {
        System.out.println("载人燃油车停止了...");
    }
}

/**
 * @Description: TODO
 * @Author: gaofan
 * @Date: 2020/3/20 14:08
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public interface CarFactory {

    // 创建载物车
    Car createCarGoCar();
    // 创建载人车
    Car createMannedCar();
}
/**
 * @Description: 燃气车工厂子类
 * @Author: gaofan
 * @Date: 2020/3/20 14:08
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class GasCarFactory implements CarFactory{

    public Car createCarGoCar() {
        return new CargoGasCar();
    }

    public Car createMannedCar() {
        return new MannedGasCar();
    }
}
/**
 * @Description: 燃油车工厂子类
 * @Author: gaofan
 * @Date: 2020/3/20 14:08
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class OilCarFactory implements CarFactory {

    public Car createCarGoCar() {
        return new CargoOilCar();
    }

    public Car createMannedCar() {
        return new MannedOilCar();
    }
}

类型: 抽象工厂模式
原理: 用于一类产品而非一个,通过抽象再抽象的思想,创建产品的抽象和工厂的抽象
缺点: 无


本文借鉴尚硅谷Java设计模式,韩顺平图解java,传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值