![设计模式就该这样学:基于经典框架源码和真实业务场景](https://wfqqreader-1252317822.image.myqcloud.com/cover/758/33114758/b_33114758.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.3 使用简单工厂模式封装产品创建细节
接下来看代码,还是以课程为例。咕泡学院目前开设有Java架构、大数据、人工智能等课程,已经形成了一个生态。我们可以定义一个课程标准ICourse接口。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_4.jpg?sign=1739296697-SeHCh2HRpk1qc1WSr5GAhXwY9DcpYlsP-0-a2e00b5e4d85d33b4baa8446c37f7346)
创建一个Java课程的实现类JavaCourse。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_5.jpg?sign=1739296697-fK95HFnkETHvq9VI3VKvXKR1eI3OsLvi-0-80a25cca7e3e8e1b44c6a7f36bb63ee7)
客户端调用代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_6.jpg?sign=1739296697-w4P9BKpBngKuPuItxuNzMnpRaBAFV1hv-0-1d1d0879b5aaf67ab5fa6ab83de0d025)
由上面代码可知,父类ICourse指向子类JavaCourse的引用,应用层代码需要依赖JavaCourse。如果业务扩展,则继续增加PythonCourse,甚至更多,那么客户端的依赖会变得越来越臃肿。因此,我们要想办法把这种依赖减弱,把创建细节隐藏。虽然在目前的代码中,创建对象的过程并不复杂,但从代码设计角度来讲不易于扩展。因此,用简单工厂模式对代码进行优化。首先增加课程PythonCourse类。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_7.jpg?sign=1739296697-pXlvVhRGThdUs70I0c1PP1SQUNmdDS3c-0-a8cf5e40984d91df88b022efa6af601c)
然后创建CourseFactory工厂类。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_8.jpg?sign=1739296697-ptjH5309Y46Cc5PfLqvbQhIhlFwK81AA-0-d5d6c832bd8dcac1c41e95df32fffe17)
最后修改客户端调用代码。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_9.jpg?sign=1739296697-tv4zbXuPcO6R3kBRXbPqgVBlawoqhTUH-0-0117e819a35665b13cb1ed58dbd19e7c)
当然,为了调用方便,可将CourseFactory的create()方法改为静态方法,其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_10.jpg?sign=1739296697-KMy128ry7QdXqzy1cSR3wi7ji2ZShFje-0-ee1225fb1449cbacee758d3d21232809)
客户端调用虽然简单了,但如果业务继续扩展,要增加前端课程,则工厂中的create()方法就要随着产品链的丰富每次都要修改代码逻辑,这不符合开闭原则。因此,我们可以采用反射技术继续对简单工厂模式进行优化,代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_11.jpg?sign=1739296697-IVZTAlDH42HV2SD3DQNIvJZyyD0eMAxf-0-1a2a6e5165b797321fbc5924fa84a429)
客户端调用代码修改如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_12.jpg?sign=1739296697-rZCX4kmtzR0eJsQEPPtALbJTSfvJS2oY-0-32ca0b89eeee2e76f5b83655b883341a)
优化之后,产品不断丰富,不需要修改CourseFactory中的代码。但问题是,方法参数是字符串,可控性有待提升,而且还需要强制转型。继续修改代码。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_13.jpg?sign=1739296697-PVbskhI4CuJ410vVWfuWFptFMPLSIoIa-0-f73383835c32f35e24fba4dc465d6d5e)
优化客户端测试代码。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_14.jpg?sign=1739296697-xcJ62lgj3dbSXYu6k4lzD5u0Qpdin1G8-0-ea75ce10d7d7165540e37963861d60ac)
最后来看如下图所示的类图。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_15.jpg?sign=1739296697-MwRSH6RPojNvJuWgehPh00iTBF9kApxN-0-d4e1bf0ff80310cafacd8b6892b822b8)