工厂方法模式(Factory Method)

**工厂方法模式(Factory Method)**是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。

在Java中,工厂方法模式通常通过定义一个接口或抽象类来实现,这个接口或抽象类中声明了一个或多个用于创建对象的工厂方法。子类通过实现这个接口或继承这个抽象类并重写工厂方法来指定具体的实例化逻辑。

下面是一个简单的Java例子,演示了工厂方法模式:

1. 定义一个产品接口

java 复制代码
public interface Product {  
    void use();  
}

2. 创建具体产品类

然后,我们创建实现了上述接口的具体产品类。

java 复制代码
public class ConcreteProductA implements Product {  
    @Override  
    public void use() {  
        System.out.println("Using ConcreteProductA");  
    }  
}  
  
public class ConcreteProductB implements Product {  
    @Override  
    public void use() {  
        System.out.println("Using ConcreteProductB");  
    }  
}

3. 创建一个工厂接口

接着,我们定义一个工厂接口,这个接口声明了工厂方法。

java 复制代码
public interface Creator {  
    Product factoryMethod();  
}

4. 创建实现了工厂接口的具体工厂类

最后,我们创建实现了工厂接口的具体工厂类,并重写工厂方法来返回特定类型的产品实例。

java 复制代码
public class ConcreteCreatorA implements Creator {  
    @Override  
    public Product factoryMethod() {  
        return new ConcreteProductA();  
    }  
}  
  
public class ConcreteCreatorB implements Creator {  
    @Override  
    public Product factoryMethod() {  
        return new ConcreteProductB();  
    }  
}

5. 客户端代码

客户端代码通过工厂类来获取产品实例,并通过产品接口来使用产品。

java 复制代码
public class Client {  
    public static void main(String[] args) {  
        Creator creatorA = new ConcreteCreatorA();  
        Product productA = creatorA.factoryMethod();  
        productA.use();  
  
        Creator creatorB = new ConcreteCreatorB();  
        Product productB = creatorB.factoryMethod();  
        productB.use();  
    }  
}

在这个例子中,Creator 接口是工厂方法模式的抽象创建者角色,ConcreteCreatorAConcreteCreatorB 是具体创建者角色,Product 接口是产品角色,而 ConcreteProductAConcreteProductB 是具体产品角色。客户端代码通过具体的创建者来创建并获取具体的产品实例,然后通过产品接口来操作这些实例。

相关推荐
guodingdingh6 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯8 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育8 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵8 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔10 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影10 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao1213111 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔11 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城12 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience14 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu