1、什么是工厂模式
工厂模式。我们可以从字面意思去理解。工厂:是用于制造物品的场所。所以工厂模式也可以理解为制造“物品”的模式。
通过代入代码理解,我们一般新建一个对象,都是通过new关键字,这种新建对象的方式,需要我们对这个对象有足够的了解,知道初始化这个对象需要哪些资源。而工厂模式便解决了这个问题,它将新建对象的过程放在一个“工厂”里面,我们需要哪个对象,只需要告诉它,它就能帮我们新建好对象返回给我们。
而工厂模式又分为简单工厂、工厂方法、抽象工厂等。
下面我们将通过代码实现来了解这三种工厂模式的区别
2、代码实现
简单工厂
package factory.mode;
public class SimpleFactory {
public static void main(String[] args) throws ClassNotFoundException {
// 简单工厂创建类
Animal cat = AnimalFactory.createAnimal("cat");
cat.cry();
Animal dog = AnimalFactory.createAnimal("dog");
dog.cry();
// 不使用工厂模式,默认实现
Animal cat2 = new Cat();
cat2.cry();
Animal dog2 = new Dog();
dog2.cry();
}
}
// 动物接口
interface Animal {
void cry();
}
// 猫
class Cat implements Animal {
@Override
public void cry() {
System.err.println("小猫喵喵叫");
}
}
// 狗
class Dog implements Animal {
@Override
public void cry() {
System.err.println("小狗汪汪叫");
}
}
// 动物简单工厂
class AnimalFactory{
public static Animal createAnimal(String type) throws ClassNotFoundException {
return switch (type.toLowerCase()){
case "cat" -> new Cat();
case "dog" -> new Dog();
default -> throw new ClassNotFoundException("类创建失败,请检查参数是否正确");
};
}
}
工厂方法
package factory.mode;
/**
* @author lmq
* @version 1.0
* @describe 工厂方法demo
* @datetime 2025/3/7 23:58
**/
public class FactoryMethod {
public static void main(String[] args) {
// 工厂方法实现
CarFactory bmwFactory = new BmwFactory();
Car bmw = bmwFactory.createCar();
bmw.start();
CarFactory porscheFactory = new PorscheFactory();
Car porsche = porscheFactory.createCar();
porsche.start();
// 不使用工厂方法,普通实现
Car bmw2 = new Bmw();
bmw2.start();
Car porsche2 = new Porsche();
porsche2.start();
}
}
// 汽车接口
interface Car {
void start();
}
// 宝马
class Bmw implements Car {
@Override
public void start() {
System.err.println("启动了宝马汽车");
}
}
// 保时捷
class Porsche implements Car {
@Override
public void start() {
System.err.println("启动了保时捷汽车");
}
}
// 汽车工厂类
interface CarFactory {
Car createCar();
}
// 宝马工厂类
class BmwFactory implements CarFactory {
@Override
public Car createCar() {
return new Bmw();
}
}
// 保时捷工厂类
class PorscheFactory implements CarFactory {
@Override
public Car createCar() {
return new Porsche();
}
}
抽象工厂
package factory.mode;
/**
* @author lmq
* @version 1.0
* @describe 抽象工厂demo
* @datetime 2025/3/8 0:32
**/
public class AbstractFactory {
public static void main(String[] args) {
GUIFactory factory;
String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("windows")){
factory = new WindowsGUIFactory();
} else{
factory = new MacGUIFactory();
}
Button button = factory.createButton();
button.render();
TextField textField = factory.createTextField();
textField.display();
}
}
// 按钮
interface Button {
void render();
}
// windows按钮
class WinwodsButton implements Button{
@Override
public void render() {
System.err.println("渲染了windows按钮");
}
}
// mac按钮
class MacButton implements Button{
@Override
public void render() {
System.err.println("渲染了mac按钮");
}
}
// 文本框
interface TextField{
void display();
}
// Windows文本框
class WindowsTextField implements TextField{
@Override
public void display() {
System.err.println("展示了windows文本框");
}
}
// mac文本框
class MacTextField implements TextField{
@Override
public void display() {
System.err.println("展示了Mac文本框");
}
}
// 抽象工厂类
interface GUIFactory{
Button createButton();
TextField createTextField();
}
// windows工厂类
class WindowsGUIFactory implements GUIFactory{
@Override
public Button createButton() {
return new WinwodsButton();
}
@Override
public TextField createTextField() {
return new WindowsTextField();
}
}
// mac工厂类
class MacGUIFactory implements GUIFactory{
@Override
public Button createButton() {
return new MacButton();
}
@Override
public TextField createTextField() {
return new MacTextField();
}
}
3、总结
简单工厂模式适合产品种类不多、变化不大的场景,使用方便但扩展性较差。
工厂方法模式通过子类实现产品创建,较好地符合开闭原则,但会增加类的数量。
抽象工厂模式适用于产品族的场景,可以保证一组相关产品的一致性,但结构相对复杂,增加新的产品族时修改较多。
评论区