抽象工厂1.定义和类型抽象工厂模式提供了一个接口来创建一系列相关或相互依赖的对象,而无需指定它们的具体类创建类型2.适用场景客户端(应用层)不依赖关于如何创建、实现产品类实例等细节。强调一系列相关的产品对象(属于同一产品系列)一起使用来创建需要大量重复代码的对象。提供一个产品类库,所有的产品使用同一个接口出现,让客户端不依赖具体的实现3.优点:特定产品在应用层的代码隔离,无需关心创建细节,共同打造系列产品。4.缺点:所有可能的创造都被指定很难在产品集合和产品集群中扩展新产品;增加了系统的抽象性和理解难度5.编码在编码之前,先明确一个概念:比如汽车厂可能做汽车、电动车、自行车。对于下面一系列的附属产品,汽车厂、电动车厂、自行车厂……在这个例子中,整个汽车厂是一个抽象工厂,下面的附属工厂依次是具体工厂。如果把整个停车场看成一个抽象类,那么具体工厂就是这个抽象类的实现。课程文章接口publicabstractclassArticle{publicabstractvoidproduce();}JAVA课程文章publicclassJavaArticleextendsArticle{@Overridepublicvoidproduce(){System.out.println("Creatingjavaarticle");}}Python课程文章publicclassPythonArticleextendsArticle{@Overridepublicvoidproduce(){System.out.println("PreparingPythonarticle...");}}课程视频接口publicabstractclassVideo{publicabstractvoidproduce();}JAVA课程视频publicclassJavaVideoextendsVideo{@Overridepublicvoidproduce(){System.out.println("正在录制java视频....");}}Python课程视频publicclassPythonVideoextendsVideo{@Overridepublicvoidproduce(){System.out.println("正在录制python视频...");}}以上是JAVA工厂和Python工厂各工厂下的两个产品。我们可以定义一个抽象工厂来指定工厂的实现创建一个抽象工厂publicinterfaceAbstractCourseFactory{VideogetCourse();ArticlegetArticle();}JAVAfactorypublicclassJavaCourseFactoryimplementsCourseFactory{@OverridepublicVideogetCourse(){//制作视频返回newJavaVideo();}@OverridepublicArticlegetArticle(){//生成一篇文章returnnewJavaArticle();}}Python工厂publicclassPythonCourseFactoryimplementsCourseFactory{@OverridepublicVideogetCourse(){//制作一个视频returnnewPythonVideo();}@OverridepublicArticlegetArticle(){//生成一篇文章returnnewPythonArticle();}}UML类图testclasspublicclassTest{publicstaticvoidmain(String[]args){//子类实例指向父类ReferenceCourseFactoryabstractFactory=newJavaCourseFactory();文章article=abstractFactory.getArticle();视频课程=abstractFactory.getCourse();文章.生产();course.produce();}}6.对比学习在实现了抽象工厂之后,我们很自然地会想到之前学过的工厂模式。那么两者有什么区别呢?简单来说,工厂模式就是对一个产品进行工厂加工,并提供获取这个产品的方法;抽象工厂是对一个产品族下的一系列产品进行工厂加工。听起来还是比较抽象,我们来看例子:FactoryMode:MouseFactoryAbstractFactory:ComputerFactory(包括创建鼠标和键盘)综上所述,AbstractFactory是FactoryMode的扩展,丰富了创建产品的种类.就像一家只卖午餐的餐厅,是午餐工厂模式;而且这家餐厅早上买早餐,中午买午餐,晚上开夜市。这是一个餐厅的抽象工厂。在使用SqlSession和Configuration对象时,通过抽象工厂保证调用者从一个工厂对象中取出的SqlSession和Configuration是匹配的。比如MySQL的SqlSession和Configuration是从MySQL工厂中取出来的,Oracle的SqlSession和Configuration是从Oracle工厂中取出来的。DefaultSqlSessionFactory实现了抽像工厂SqlSessionFactory,可以直接返回配置信息及sqlsessionpublicclassDefaultSqlSessionFactoryimplementsSqlSessionFactory{privatefinalConfigurationconfiguration;publicDefaultSqlSessionFactory(Configurationconfiguration){this.configuration=configuration;}....@OverridepublicSqlSessionopenSession(ExecutorTypeexecType,booleanautoCommit){returnopenSessionFromDataSource(execType,null,autoCommit);}@OverridepublicConfigurationgetConfiguration(){返回配置;}privateSqlSessionopenSessionFromDataSource(ExecutorTypeexecType,TransactionIsolationLevellevel,booleanautoCommit){Transactiontx=null;try{finalEnvironmentenvironment=configuration.getEnvironment();finalTransactionFactorytransactionFactory=getTransactionFactoryFromEnvironment(环境);tx=transactionFactory.newTransaction(environment.getDataSource(),level,autoCommi吨);最终执行器executor=configuration.newExecutor(tx,execType);返回新的DefaultSqlSession(配置、执行器、自动提交);}catch(Exceptione){closeTransaction(tx);//可能已经获取了一个连接,所以让我们调用close()throwExceptionFactory.wrapException("Erroropeningsession.Cause:"+e,e);}最后{ErrorContext.instance().reset();}}}
