Redian新闻
>
为什么要使用工厂设计模式?

为什么要使用工厂设计模式?

教育

使用 Java 面向对象编程语言的开发小伙伴们,应该十分熟悉针对现实世界进行建模这个环节,将常见属性和行为封装成类,而要使用这些类就需要通过创建对象的形式来使用对应属性和触发对应的行为,在面向对象编程中创建与使用对象是最基础的操作了。

但是创建对象有些时候常常又会遇到对某些对象的初始化又或者其它相对复杂的初始化操作了,再或者我们需要对创建对象的逻辑进行复用和封装来保证程序的简化与安全。
是否有方式来简化创建对象的逻辑呢?这就需要用到设计模式中的创建型模式了,创建型设计模式通过隐藏创建对象的逻辑来简化创建对象的操作,让我们可以灵活的创建对象。

常见的创建型设计模式有:工厂模式、抽象工厂模式、单例模式,建造者模式、原型模式。

这些创建型设计模式都可以帮我们简化创建对象的逻辑,不过使用场景和解决的问题略有不同。接下来我们就先来看一看创建型设计模式中的工厂模式吧。

简单工厂 Simple Factory

接下来先来看下简单工厂的相关实现,首先我们有一个需求,需要来创建新能源汽车,新能源汽车有数万个零部件创建过程非常复杂,借助简单工厂设计模式将复杂的逻辑封装在简单工厂之中。
简单工厂设计模式示例代码如下所示:
/** * 具体的火车类 */public class Train extends Car{
/** * 驾驶火车 */ @Override void drive() { System.out.println("Train drive"); }} /** * 具体的卡车类 */public class Truck extends Car{ /** * 驾驶卡车 */ @Override void drive() { System.out.println("Truck drive"); }} /** * 抽象的汽车类 */public abstract class Car { /** * 驾驶汽车 */ abstract void drive();} /** * 汽车工厂类 */public class CarFactory {
/** * 根据汽车类型创建汽车 * @param type * @return */ public static Car createCar(String type) { if (type.equals("train")) { return new Train(); } else if (type.equals("truck")) { return new Truck(); } else { throw new IllegalArgumentException("Unknown car type: " + type); } }}/** * 这是一个Demo类,用于测试工厂类 */public class CarFactoryDemo { public static void main(String[] args) { //创建汽车工厂类 CarFactory carFactory = new CarFactory(); //通过工厂类获取火车对象 Car train = carFactory.createCar("train"); //驾驶火车 train.drive(); //通过工厂类获取卡车对象 Car truck = carFactory.createCar("truck"); //驾驶卡车 truck.drive(); }}

普通工厂 Ordinary Factory

可以看到前面的简单工厂有效的解决了创建汽车对象的封装与统一,但是引入了一堆的 if-else 判断,面向对象的程序不同于面向过程的程序这种复杂的 if-else 判断我们可以通过创建更多的工厂来解决。

接下来可以看下普通工厂设计模式的逻辑,普通工厂中不仅仅这些产品是抽象的,工厂也可以是抽象的。面对不同种的产品实现,就可以对应不同种的工厂实现。接下来可以通过图来看下:

普通工厂对应的逻辑代码如下:
 /** * 抽象的汽车类 */public abstract class Car {    /**     * 驾驶汽车     */    abstract void drive();}/** * 具体的火车类 */public class Train extends Car {
/** * 驾驶火车 */ @Override void drive() { System.out.println("Train drive"); }}/** * 具体的卡车类 */public class Truck extends Car { /** * 驾驶卡车 */ @Override void drive() { System.out.println("Truck drive"); }}/** * 汽车工厂类 */public abstract class CarFactory {
/** * 根据汽车类型创建汽车 * @param type * @return */ public abstract Car createCar();}public class TrainFactory extends CarFactory {
@Override public Car createCar() { return new Train(); }
}public class TruckFactory extends CarFactory{
@Override public Car createCar() { return new Truck(); }}/** * 这是一个Demo类,用于测试工厂类 */public class CarFactoryDemo { public static void main(String[] args) { //通过工厂类获取火车对象 CarFactory trainFactory = new TrainFactory(); Car train = trainFactory.createCar(); //驾驶火车 train.drive();
CarFactory truckFactory = new TruckFactory(); //通过工厂类获取卡车对象 Car truck = truckFactory.createCar(); //驾驶卡车 truck.drive(); }}

抽象工厂 Abstract Factory

普通工厂有效的通过具体工厂实现来解决了简单工厂大量的 if-else 判断,但是也引来新的问题,如果产品类型比较多,大量的工厂实现会导致工厂类增多,抽象工厂将普通工厂再做一层抽象,同时进行折中处理,通过抽象工厂获取到大的工厂实现,工厂实现再根据逻辑来创建同一种类型的产品的不同实现。

可以看到工厂设计模式封装了对象的创建过程,提高了代码的可维护性和可扩展性,降低了客户端的复杂度,符合开闭原则,即对扩展开放,对修改关闭。
当需要增加新的产品时,只需要增加一个具体产品类和相应的工厂类即可,而不需要修改已有的代码,在我们平时的开发工作中也经常会遇到。
比如 Spring 框架中的 BeanFactory 和 ApplicationContext,它们负责创建和管理应用程序中的对象。
Log4j 日志框架:Log4j 框架中的 LoggerFactory 就是工厂模式的实现,它负责创建和管理 Logger 对象,MyBatis 框架中的 SqlSessionFactory 就是工厂模式的实现,它负责创建和管理 SqlSession 对象等等。
工厂设计模式其实是简单易用的,小伙伴们可以去尝试使用!

BY / 
作者:宋小生
编辑:平平
声明:本文归“力扣”版权所有,如需转载请联系。

点个在看,少个 bug

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
如何理解小米全新的利润增长模式?跟着iLogtail学习设计模式10种电视墙的设计形式,你喜欢哪一式?【装修干货】看完巴黎时装周,终于知道为什么要出国学服装设计了2024年不用设计模板,你很难坚持下去!大话封神010:纣王为什么要杀妻弃子?姜皇后为什么必须死?山河颂上门保洁竟是卖淫新模式?还有私人伴游也是?特斯拉得州超级工厂屋顶太阳能工程完成第一阶段,建成后将为全球最大;陕汽两工厂入选国家级智能制造示范工厂丨智能制造日报6000人死亡,10000人失踪!沙漠特大洪灾来袭!地球自毁模式?花西子代工厂被曝为日资?工厂承认:但……ICCV 2023 | 港中文MMLab: 多帧光流估计模型VideoFlow,首次实现亚像素级别误差法律人需要什么样的经济学思维方式?中国药闻会客厅丨什么样的颈椎病需要手术治疗?有哪些手术方式?周瑞家的为什么要改送宫花的顺序?林黛玉为什么那么小气?牛仔裤与大妈气从工厂货到客单价上千,传统音响工厂也能做出小红书高端爆款人类啪啪啪为什么要关门而猩猩却不用?突发!加拿大卫生部紧急召回!大统华多款未经授权的保健品不要使用!6岁“最萌摄影师”现身村超,作品曾被《中国国家地理》两度收录:什么才是“家学传承”最正确的打开方式?荷兰人为什么要造风车?产能规模超三峡数十倍的新型储能,还没找到良性商业模式?山东农村阿姨和机械臂配合,让这家羽绒服工厂销售过亿|聪明的工厂江淮汽车公开挂牌转让资产,蔚来将告别江淮代工模式?美国入境档案--张承哲,1910年旧金山“面试HR问能不能接受日不落模式??” 哈哈哈哈哈哈别太荒谬了!!你为什么要学分镜,学会分镜后对工作有什么提升?全网最新最齐全的设计模板,已经为你整理好了!美国工厂用工荒:年薪90万,招不到建筑工美国又要使坏了我们为什么要读历史代码共享的陨落:为什么说内部库是反模式?美国房市有这些好消息“背水一战”,小鹏重回经销模式?为什么要读文献?读什么样的文献?小白从刚开始从几分的文章开始读好一点?
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。