![设计模式就该这样学:基于经典框架源码和真实业务场景](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=1739697514-8FqkYhaUjoZPO6Stv9U1BEkt5GKMCNGI-0-5e9935a7e82b16ca8cbe2a3e74780178)
创建一个Java课程的实现类JavaCourse。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_5.jpg?sign=1739697514-CfTyHfktHMA1GHQouY63Lij7k1iC07DU-0-bee9c5409a46ed54a98eb0b119e0b7a8)
客户端调用代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_6.jpg?sign=1739697514-hwI27Zkw8ytRwa6syzij9GSd0Kvp424X-0-845669bd19369f673db62914c9db416f)
由上面代码可知,父类ICourse指向子类JavaCourse的引用,应用层代码需要依赖JavaCourse。如果业务扩展,则继续增加PythonCourse,甚至更多,那么客户端的依赖会变得越来越臃肿。因此,我们要想办法把这种依赖减弱,把创建细节隐藏。虽然在目前的代码中,创建对象的过程并不复杂,但从代码设计角度来讲不易于扩展。因此,用简单工厂模式对代码进行优化。首先增加课程PythonCourse类。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_7.jpg?sign=1739697514-Ip00rGGaEFqeXzVpRBxZdtMZPzDqCVtP-0-2285351fa41368224c1108916a9b9d74)
然后创建CourseFactory工厂类。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_8.jpg?sign=1739697514-8WXoveBs0zcMCDbnJFbwoWS9BFQawSKx-0-c576b975fffcf8237ab32d631f524043)
最后修改客户端调用代码。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_9.jpg?sign=1739697514-6aGymU2cympe6Q8YhZPNTmqGUUDqW3Gd-0-590470f9bb0d8997f6b67eaf84de476d)
当然,为了调用方便,可将CourseFactory的create()方法改为静态方法,其类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_10.jpg?sign=1739697514-ZZxpCQIX5ulqi2oshexogc8Wyu0St350-0-e1b8e12c9fbcc483317f9bb3ae37dbdf)
客户端调用虽然简单了,但如果业务继续扩展,要增加前端课程,则工厂中的create()方法就要随着产品链的丰富每次都要修改代码逻辑,这不符合开闭原则。因此,我们可以采用反射技术继续对简单工厂模式进行优化,代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_11.jpg?sign=1739697514-yYhdv8D1KO68nvUkZ18lbN2eIzYcttFN-0-dd1171f093b2211a73ad5abd81016127)
客户端调用代码修改如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_12.jpg?sign=1739697514-w8c5r2W3veOOWAwNloTyjV1RlAe740tv-0-992671110ce21863aa28b05c1705f899)
优化之后,产品不断丰富,不需要修改CourseFactory中的代码。但问题是,方法参数是字符串,可控性有待提升,而且还需要强制转型。继续修改代码。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_13.jpg?sign=1739697514-DYb43J4aTgqf6g3lHCs6mAqz9qFSXMv1-0-562b8219742abf183217cb74d04ef5d0)
优化客户端测试代码。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_14.jpg?sign=1739697514-TAs4xQfl8PSZQDTfJEBQLP096pObyCFU-0-81f0c42361d2b7f818d96f9410ac417e)
最后来看如下图所示的类图。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt007_15.jpg?sign=1739697514-116a7FCYA7GR8gnuWMmdtrso3ailrizB-0-3844cc6d993a298f54a9c1f88a2d1b1c)