设计模式-创建型模式-工厂方法模式

工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。工厂方法模式是一种类创建型模式。

弥补了简单工厂模式,每增加一个产品就增加一个分支的缺点,简单工厂不符合封闭-开放原则,工厂方法模式增加新的产品时,需要增加新的产品类与工厂类,不改变原有程序。

复制代码
首先,定义一个创建产品对象的接口(或者抽象类):
public interface Product {
    void operation();
}

然后,创建实现了Product接口的具体产品类:
public class ConcreteProductA implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductA operation");
    }
}

public class ConcreteProductB implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductB operation");
    }
}

接下来,定义一个抽象工厂类,其中包含一个创建产品对象的工厂方法:
public abstract class Creator {
    public abstract Product factoryMethod();

    public void useProduct(Product product) {
        product.operation();
    }
}

然后,创建继承了抽象工厂类并实现了工厂方法的具体工厂类:
public class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

public class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}

最后,客户端代码使用具体工厂类来创建产品对象,并调用其方法:
public class Client {
    public static void main(String[] args) {
        Creator creatorA = new ConcreteCreatorA();
        Product productA = creatorA.factoryMethod();
        creatorA.useProduct(productA);

        Creator creatorB = new ConcreteCreatorB();
        Product productB = creatorB.factoryMethod();
        creatorB.useProduct(productB);
    }
}
相关推荐
YuTaoShao2 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw3 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨3 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4044 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空4 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643145 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0015 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
使二颗心免于哀伤5 小时前
《设计模式之禅》笔记摘录 - 10.装饰模式
笔记·设计模式
誰能久伴不乏5 小时前
Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
java·服务器·前端
慕y2745 小时前
Java学习第七十二部分——Zookeeper
java·学习·java-zookeeper