Java设计模式之《工厂模式》
目录
1、介绍
1.1、定义
1.2、优缺点
1.3、使用场景
2、实现
2.1、简单工厂模式
2.2、工厂方法模式
2.3、抽象工厂模式
3、小结
前言
在面向对象编程中,创建对象实例最常用的方式就是通过 new 操作符构造一个对象实例,但在某些情况下,new 操作符直接生成对象会存在一些问题。
举例来说,对象的创建需要一系列的步骤:
可能需要计算或取得对象的初始位置、选择生成哪个子对象实例、或在生成之前必须先生成一些辅助对象。
在这些情况,新对象的建立就是一个 “过程”,而不仅仅是一个操作,就像一部大机器中的一个齿轮传动。
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需指定具体的实现类。
Java设计模式分类,如下所示:
1、介绍
1.1、定义
工厂模式将目的将创建对象的具体过程屏蔽隔离起来,从而达到更高的灵活性。
如下所示:
工厂模式可以分为三类:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
1、在没有工厂的时代:
如果客户需要一款宝马车,那么就需要客户去创建一款宝马车,然后拿来用。
2、简单工厂模式:
后来出现了工厂,用户不再需要去创建宝马车,由工厂进行创建,想要什么车,直接通过工厂创建就可以了。比如想要320i系列车,工厂就创建这个系列的车。
3、工厂方法模式:
为了满足客户,宝马车系列越来越多,如320i、523i等等系列,一个工厂无法创建所有的宝马系列,于是又单独分出来多个具体的工厂,每个具体工厂创建一种系列,即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象,你需要指定某个具体的工厂才能生产车出来。
4、抽象工厂模式:
随着客户要求越来越高,宝马车必须配置空调,于是这个工厂开始生产宝马车和需要的空调。最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车。
1.2、优缺点
-
将对象的创建与使用分离。
-
降低系统的耦合度。
-
便于扩展新的产类型。
1.3、使用场景
-
如果只是创建单个对象的不同实现(如不同的数据库连接),用工厂方法。
-
如果需要创建配套的一组对象(如不同操作系统的UI组件套件),用抽象工厂。
2、实现
2.1、简单工厂模式
// 产品接口
interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}// 具体产品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}// 简单工厂
class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}throw new IllegalArgumentException("Unknown product type");}
}// 使用示例
public class Main {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.use(); // 输出: Using Product AProduct productB = SimpleFactory.createProduct("B");productB.use(); // 输出: Using Product B}
}
2.2、工厂方法模式
相比较于抽象工厂模式,可以对接口的实现纵向扩展。
// 产品接口
interface Engine {void start();
}// 具体产品
class ElectricEngine implements Engine {public void start() { System.out.println("电动机启动"); }
}class FuelEngine implements Engine {public void start() { System.out.println("燃油发动机启动"); }
}// 工厂接口(只生产发动机)
interface EngineFactory {Engine createEngine();
}// 具体工厂
class ElectricEngineFactory implements EngineFactory {public Engine createEngine() { return new ElectricEngine(); }
}class FuelEngineFactory implements EngineFactory {public Engine createEngine() { return new FuelEngine(); }
}// 使用示例
public class Main {public static void main(String[] args) {EngineFactory ef = new ElectricEngineFactory();Engine engine = ef.createEngine();engine.start(); // 输出: 电动机启动}
}
特点:
-
只生产发动机这一种产品
-
如果要新增空调组件,需要另写一套空调工厂
2.3、抽象工厂模式
相比于工厂方法模式,抽象工厂模式,可以横向扩展。
// 产品族接口
interface Engine {void start();
}interface AirConditioner {void cool();
}// 电动系列产品
class ElectricEngine implements Engine {public void start() { System.out.println("电动机启动"); }
}class ElectricAirConditioner implements AirConditioner {public void cool() { System.out.println("电子变频空调工作"); }
}// 燃油系列产品
class FuelEngine implements Engine {public void start() { System.out.println("燃油发动机启动"); }
}class FuelAirConditioner implements AirConditioner {public void cool() { System.out.println("机械压缩机空调工作"); }
}// 抽象工厂接口(能生产整套组件)
interface CarFactory {Engine createEngine();AirConditioner createAirConditioner();
}// 具体工厂
class ElectricCarFactory implements CarFactory {public Engine createEngine() { return new ElectricEngine(); }public AirConditioner createAirConditioner() { return new ElectricAirConditioner(); }
}class FuelCarFactory implements CarFactory {public Engine createEngine() { return new FuelEngine(); }public AirConditioner createAirConditioner() { return new FuelAirConditioner(); }
}// 使用示例
public class Main {public static void main(String[] args) {CarFactory cf = new ElectricCarFactory();Engine engine = cf.createEngine();AirConditioner ac = cf.createAirConditioner();engine.start(); // 输出: 电动机启动ac.cool(); // 输出: 电子变频空调工作}
}
特点:
-
一个工厂能生产配套的发动机+空调
-
保证电动车的发动机和空调是电子化的,燃油车的都是机械化的
3、小结
1、简单工厂模式:
一个工厂类根据传入的参数决定创建哪种产品类的实例。
2、工厂方法模式:
定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。
3、抽象工厂模式:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
参考文章:
1、Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)_简单工厂模式,工厂方法模式,抽象工厂模式-CSDN博客https://blog.csdn.net/a745233700/article/details/120253639?ops_request_misc=%257B%2522request%255Fid%2522%253A%252227ffb8b4a369e0e5024f4e17abda46f3%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=27ffb8b4a369e0e5024f4e17abda46f3&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-120253639-null-null.142^v102^pc_search_result_base1&utm_term=%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187