设计模式:工厂模式,解除耦合的利器

本文深入探讨了工厂模式在软件设计中的应用,包括其分类、优点及其实现方式,通过实例讲解了简单工厂模式和工厂模式的区别。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

Fear not that the life shall come to an end, but rather fear that it shall never have a beginning.

不要害怕你的生活将要结束,应该担心你的生活永远不会真正开始。

每日掏心

有时候,你需要出去走一走,呼吸一下新鲜空气,然后提醒自己,你是谁,想成为什么样的人。你若将过去抱的太紧,怎么能腾出手来拥抱现在。

来自:xue无止境 | 责编:乐乐

链接:cnblogs.com/yeya/p/11155883.html

程序员小乐(ID:study_tech)第 706 次推文   图片来自网络

往日回顾:阿里技术专家带你使用Spring框架快速搭建Web工程项目

   正文   

为什么要用工厂模式?

解答这个问题前,我们先来了解什么是工厂模式。

工厂模式其实也称创建模式,是用于创建对象的一种方式。本质上就是用工厂方法来代替new实例化对象。

举个例子:我们在编写代码的时候,在一个A类中通过new的方式实例化了类B,那么A类和B类之间就存在耦合,如果以后修改了B类的代码和使用方式,例如需要在构造函数中传入参数,那么A类也就需要跟着修改了,一个类的依赖可能影响不大,但若有多个类依赖了B类,那么这个工作量将会相当的大,这无疑是件非常痛苦的事。这种情况下,我们需要把创建实例的工作单独分离,与调用方解耦,也就是使用工厂方法创建实例的工作封装起来。这样我们在需要调用对象的时候就不需要关心那些复杂的实例化问题。

工厂模式

工厂模式可分为两类:简单工厂模式和工厂模式。

简单工厂模式

定义一个接口和实现类,建立一个工厂类这些实现类进行实例的创建。

我们用球来举例,定义一个基本的接口Ball,和一个抽象方法Play (玩),

public interface Ball {
void play();
}

创建一个篮球的类和一个足球的类,并实现该接口,

public class BasketBall implements Ball {
public void play() {
System.out.println("打篮球~~~");
}
}
public class FootBall implements Ball {
public void play() {
System.out.println("踢足球~~~");
}
}

然后,创建一个工厂类,可以用于生产篮球或者足球,

public class BallFactory {

public Ball produce(String type) {
if ("basketball".equals(type)) {
return new BasketBall();
} else if ("football".equals(type)) {
return new FootBall();
}
return null;
}
}

工厂类建好以后,我们就可以实例化工厂类,并调用 produce 方法来创建对应的实例对象,

public static void main(String[] args) {
BallFactory factory = new BallFactory();
Ball ball = factory.produce("basketball");
ball.play();
}

结果输出:打篮球~~~

这就是简单工厂模式的基本实现,用关系图来表示就是:

这种模式的优点是代码简单,能够根据具体的参数返回对应的实例对象。

当然缺点也很明显,就是工厂类集中了所有实例的创建逻辑,如果增加业务就要多出相应的工厂方法,不仅代码可能变得臃肿,也容易违反GRASPR的高内聚的责任分配原则

工厂模式

又称多态性工厂模式,是对简单工厂模式的改进。工厂模式中,一个子类对应一个工厂类,这些工厂类都实现了一个工厂接口。这相当于把一个简单工厂类拆分成多个工厂,这样代码就不会都耦合在同一个类里了。

具体的产品接口和实现类还是复用上面的代码,我们只需关注工厂方法的逻辑即可,

先创建一个工厂的接口

public interface IFactory {
void produce();
}

然后创建对应业务的工厂类

public class BasketFactory implements IFactory {
public Ball produce() {
return new BasketBall();
}
}
public class FootFactory implements IFactory {
public Ball produce() {
return new FootBall();
}
}

测试代码

public static void main(String[] args) {
BasketFactory basketFactory = new BasketFactory();
Ball basket = basketFactory.produce();
FootFactory footFactory = new FootFactory();
Ball foot = footFactory.produce();
basket.play();
foot.play();
}

输出结果是:

打篮球~~~
踢足球~~

如上所示,如果需要添加新的产品,如排球,我们就多写一个工厂类即可,这样就不会把所有的业务都耦合到一个工厂类中了,用关系图表示如下:

最后,总结一下工厂模式的优点吧,

1、良好的封装性,代码结构清晰,调用者只需知道产品的类名即可,不需要知道创建对象的过程,降低代码间的耦合。

2、扩展性优秀,如果增加一个产品类,只需增加一个对应的工厂类。

3、屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。

4、工厂模式是典型的解耦框架,高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。


欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入程序员小乐技术群,在公众号后台回复“加群”或者“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

假如有人把支付宝存储服务器炸了(物理炸),大众在支付宝里的钱是不是就都没有了呢?

同步锁基本原理与实现,看这篇就够了!

Java 非阻塞 IO 和异步 IO,看了都说好!

关注「程序员小乐」,收看更多精彩内容

嘿,你在看吗

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值