前言
目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的工厂模式~
本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~
工厂模式
工厂模式是一种常用的设计模式,它提供了一种创建对象的方式,该方式隐藏了对象创建的细节并提供了一个通用的接口,从而使得代码更加灵活和可扩展。在工厂模式中,我们将对象的创建过程封装到一个工厂类中,通过工厂类来创建具体的对象,这样客户端就不需要关心对象的创建过程,只需要调用工厂类提供的接口来获取所需的对象即可。
工厂模式包括三种常见的类型:简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式 Simple Factory Pattern
简单工厂模式是最基本的工厂模式,也叫静态工厂方法模式。它由一个工厂类负责创建所有的对象,客户端只需要传入相应的参数即可得到所需的对象。例如,我们可以定义一个简单工厂类,通过传入不同的参数,返回不同的对象
请看如下代码:
class SimpleFactory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ConcreteProductA();
} else if (type.equals("B")) {
return new ConcreteProductB();
} else {
return null;
}
}
}
interface Product {
}
class ConcreteProductA implements Product {
}
class ConcreteProductB implements Product {
}
工厂方法模式(Factory Method Pattern)
工厂方法模式是简单工厂模式的一种变形,它不再由一个工厂类来负责创建所有的对象,而是由一个抽象工厂类定义了一个工厂方法接口,由子类来实现该接口以创建具体的产品对象。这样,每个具体产品都有一个对应的工厂类,客户端只需要和具体的工厂类交互,而不需要知道具体产品的创建过程。例如,我们可以定义一个抽象工厂类和两个具体工厂类,
下面一起实现一下
public interface MethodFactory {
public MethodProduct createProduct();
}
interface MethodProduct {
}
class ConcreteFactoryA implements MethodFactory {
@Override
public MethodProduct createProduct() {
return new ProductA();
}
}
class ConcreteFactoryB implements MethodFactory {
@Override
public MethodProduct createProduct() {
return new ProductB();
}
}
class ProductA implements MethodProduct {}
class ProductB implements MethodProduct {}
抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式是一种更加复杂的工厂模式,它通过提供一组相关或者相互依赖的产品对象组成的工厂,来实现创建一系列相关或者相互依赖的对象。在抽象工厂模式中,客户端不需要关心具体的产品对象,只需要关心所需要的产品对象所属的工厂即可。例如,我们可以定义一个抽象工厂接口和两个具体工厂类
public interface AbstractFactory {
AbsProductA createAbsProductA();
AbsProductB createAbsProductB();
}
interface AbsProductA {}
interface AbsProductB {}
class ProductA1 implements AbsProductA{}
class ProductB1 implements AbsProductB{}
class ProductA2 implements AbsProductA{}
class ProductB2 implements AbsProductB{}
class AbsProductFactory1 implements AbstractFactory {
@Override
public AbsProductA createAbsProductA() {
return new ProductA1();
}
@Override
public AbsProductB createAbsProductB() {
return new ProductB1();
}
}
class AbsProductFactory2 implements AbstractFactory {
@Override
public AbsProductA createAbsProductA() {
return new ProductA2();
}
@Override
public AbsProductB createAbsProductB() {
return new ProductB2();
}
}
客户端可以根据需要使用不同的工厂来创建不同的产品对象
class AbsFactoryTest {
public static void main(String[] args) {
AbstractFactory fa1 = new AbsProductFactory1();
AbsProductA p1a = fa1.createAbsProductA();
AbsProductB p1b = fa1.createAbsProductB();
AbstractFactory fa2 = new AbsProductFactory2();
AbsProductA p2a = fa2.createAbsProductA();
AbsProductB p2b = fa2.createAbsProductB();
}
}
总之,工厂模式能够提高代码的可维护性和可扩展性,将对象的创建和使用分离,使得系统更加灵活和易于修改。在实际开发中,可以根据具体的需求选择不同的工厂模式。
下面通过一个小例子来看一下它的实际应用,假设我们正在开发一个电商平台,需要实现不同支付方式的支付功能。我们可以使用抽象工厂模式来创建不同的支付方式对象。首先,我们定义一个支付接口和多个具体支付类
public interface Payment {
void pay();
}
public class WxPay implements Payment {
@Override
public void pay() {
System.out.println("微信支付");
}
}
public class JdPay implements Payment {
@Override
public void pay() {
System.out.println("京东支付");
}
}
public class AliPay implements Payment {
@Override
public void pay() {
System.out.println("支付宝支付");
}
}
然后,我们定义一个抽象支付工厂接口和多个具体支付工厂类,用于创建不同类型的支付方式对象
public interface PayFactory {
Payment createPayment();
}
public class JdPayFactory implements PayFactory {
@Override
public Payment createPayment() {
return new JdPay();
}
}
public class AliPayFactory implements PayFactory {
@Override
public Payment createPayment() {
return new AliPay();
}
}
public class WxPayFactory implements PayFactory{
@Override
public Payment createPayment() {
return new WxPay();
}
}
最后,我们可以在电商平台中使用不同的工厂来创建不同类型的支付方式对象,假如我想调用微信支付:
public class PayTest {
public static void main(String[] args) throws Exception {
PayFactory wxPay = new WxPayFactory();
Payment wxPayPayment = wxPay.createPayment();
wxPayPayment.pay();
}
}
运行一下:
微信支付
在这个例子中,我们使用抽象工厂模式将支付方式对象的创建和使用分离开来,使得系统更加灵活和易于扩展。如果我们需要添加新的支付方式,只需要添加相应的具体支付类和工厂类即可,不需要修改已有的代码。同时,通过使用抽象工厂模式,我们可以保证创建出来的支付方式对象是相互依赖的,符合设计原则,使得代码更加健壮和可靠。
结束语
下节给大家讲建造者模式~
本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注鼓励一下呗~
相关文章
项目源码(源码已更新 欢迎star⭐️)
Kafka 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
博客(阅读体验较佳)
本文正在参加「金石计划」