工厂方法模式(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 是具体产品角色。客户端代码通过具体的创建者来创建并获取具体的产品实例,然后通过产品接口来操作这些实例。

相关推荐
Javatutouhouduan8 小时前
2026Java面试的正确打开方式!
java·高并发·java面试·java面试题·后端开发·java编程·java八股文
JAVA面经实录9178 小时前
Java初级最终完整版学习路线图
java·spring·eclipse·maven
Cat_Rocky9 小时前
k8s-持久化存储,粗浅学习
java·学习·kubernetes
知识领航员10 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
释怀°Believe10 小时前
Spring解析
java·后端·spring
ooseabiscuit10 小时前
Laravel4.x:现代PHP框架的奠基之作
java·开发语言·php
节奏昂11 小时前
【一份基础软件的下载地址和安装地址】
java
没什么本事11 小时前
关于C# panel 添加lable问题 -- 明确X和Y 位置错误
android·java·c#
dhashdoia11 小时前
GPT-5.5 代码开发实战:Codex与Browser Use深度集成与星链4SAPI优化方案
java·数据库·人工智能·gpt·架构
xuhaoyu_cpp_java12 小时前
SpringMVC学习(二)
java·经验分享·笔记·学习·spring