当前位置: 首页 > 科技观察

一篇学习抽象工厂模式的文章

时间:2023-03-16 23:33:12 科技观察

本文转载自微信公众号《好困》,作者萌新。转载此文,好困烦请联系我公众号。目的是定义一个超级工厂,用于创建其他相应的产品工厂。这个工厂又可以被看作是其他各种工厂的工厂。主要解决接口选择问题关键代码将多个同类型的产品聚合到一个工厂中,然后定义超级工厂创建对应的工厂。优势当产品系列中的多个对象设计为一起工作时,每次提取都保证提取相同类型的产品。缺点:扩展产品系列非常困难。要在系列中添加某个产品,对象太多。当使用场景需要生成不同类型的产品系列时。如:白猫、黑猫等。它们可以组成同一个产品“猫”。而大狗、小狗等可以组成同一个商品“狗”,所以我们可以保证每次拿到的都是同款商品。当你得到一只猫时,你可以在里面得到一整套各种品种的猫。具体实现Createfirstproductfamily1/**2*firstproduct,dog3*/4publicinterfaceDog{56//设置狗的公共奔跑动作7voidrun();8}对应产品族对应产品狗一号产品1/**2*Dog产品族->BigDog3*/4publicclassBigDogiimplementsDog{56@Override7publicvoidrun(){8System.out.println("Thebigdogrunsfast...");9}0}Dog第二个产品1/**2*Dog产品系列->SmallDog3*/4publicclassSmallDogiimplementsDog{56@Override7publicvoidrun(){8System.out.println("Thesmalldogrunsslow...");9}0}创建一个dog工厂,生成dog产品1/**2*生成对应Dogs的工厂3*/4publicclassDogFactoryextendsAnimeFactory{567@Override8publicDoggetDog(Stringsize){9if("BIG".equals(size.toUpperCase())){10returnnewBigDog();11}elseif("SMALL".equals(size.toUpperCase())){12returnnewSmallDog();13}14returnull;15}161718@Override19publicCatgetCat(Stringcolor){20returnull;21}22}创建第二个产品系列1/**2*第二个产品cat3*/4publicinterfaceCat{56//Cat的publicaction7voidspeak();8}其产品族对应的产品:Cat第一个产品1/**2*Catproductfamily->BlackCat3*/4publicclassBlackCatimplementsCat{56@Override7publicvoidspeak(){8System.out.println("Blackcatspeakmiaomiao");9}0}猫二品1/**2*猫品族->WhiteCat3*/4publicclassWhiteCatimplementsCat{56@Override7publicvoidspeak(){8System.out.println("Whitecatspeakmiaomiaomiao");9}0}创建一个Cat工厂生成cat1/**2*生成对应的Cat工厂3*/4publicclassCatFactoryextendsAnimeFactory{56@Override7publicDoggetDog(Stringsize){8returnull;9}1011@Override12publicCatgetCat(Stringcolor){13if("WHITE".equals(color.toUpperCase())){14returnnewWhiteCat();15}elseif("BLACK".equals(color.toUpperCase())){16returnnewBlackCat();17}18returnnull;19}20}最后创建一个超级工厂,生成对应的Factory1/**2*超级抽象工厂,用于创建其他工厂3*/4publicabstractclassAnimeFactory{56publicabstractDoggetDog(Stringsize);78publicabstractCatgetCat(Stringcolor);90}1/**2*用于生成对应工厂的工具类3*/4publicclassFactoryProducer{56publicstaticAnimeFactorygetAnimeFactory(Stringtype){7if("CAT".equals(type.toUpperCase())){8//生成猫对应的工厂9returnnewCatFactory();10}elseif("DOG".equals(type.toUpperCase())){11//生成对应的狗工厂12returnnewDogFactory();13}14returnull;15}1617}Test:1/**2*测试类3*/4publicclassTest{56publicstaticvoidmain(String[]args){7//获取猫工厂8AnimeFactoryfactory=FactoryProducer.getAnimeFactory("cat");9Catcat=factory.getCat("Black");10cat.speak();1112//获取狗工厂13factory=FactoryProducer.getAnimeFactory("dog");14Dogdog=factory.getDog("Big");15dog.运行();16}1718}