Java设计模式笔记之抽象工厂代码示例
上一篇说到了工厂模式,那么学习了工厂模式,抽象工厂也得学习一下。实际上,抽象工厂模式实际上就是在工厂模式的基础上再嵌套一层工厂模式而已,通过父工厂制造子工厂。只是,也并不完全是嵌套一层,各个工厂会被抽象成一个集多个工厂共同点的抽象类。通过工厂制造器,创建出该抽象工厂的子类。
好比如说,一个博客页面有个换肤系统。那么假如有两套风格,黑和白。那么,我选择了黑色风格的,实际这步就相当通过换肤系统这个工厂制造器,创建出一个黑色主题的工厂,该黑色主题的工厂内可以生产各种黑色风格的产品,比如黑色头像挂饰,黑色背景,黑色的xxx等,然后通过这些黑色主题产品完成了整个换肤操作。白色主题也如此。
好吧,上次以水果工厂作为一个类,那么这次要创建一个蔬菜工厂,水果和蔬菜这两类都属于种植物,那么我们就可以根据这一共同点抽象出一个种植物抽象类,即种植物工厂。
首先,创建产品类,包括上次的水果,和现在的蔬菜,他们都实现了水果类接口和蔬菜类接口:
水果系列:
publicinterfaceFruit{ voidprintInfo(); }
publicclassAppleimplementsFruit{ @Override publicvoidprintInfo(){ //TODOAuto-generatedmethodstub System.out.println("苹果"); } }
publicclassBananaimplementsFruit{ @Override publicvoidprintInfo(){ //TODOAuto-generatedmethodstub System.out.println("香蕉"); } }
publicclassOrangeimplementsFruit{ @Override publicvoidprintInfo(){ //TODOAuto-generatedmethodstub System.out.println("橙子"); } }
接着是蔬菜系列:
publicinterfaceVegetable{ publicvoidprintInfo(); }
publicclassTomatoimplementsVegetable{ @Override publicvoidprintInfo(){ //TODOAuto-generatedmethodstub System.out.println("西红柿"); } }
publicclassCabbageimplementsVegetable{ @Override publicvoidprintInfo(){ //TODOAuto-generatedmethodstub System.out.println("白菜"); } }
publicclassEggplantimplementsVegetable{ @Override publicvoidprintInfo(){ //TODOAuto-generatedmethodstub System.out.println("茄子"); } }
然后,是它们各自的工厂类:
水果工厂:
publicclassFruitFactoryextendsPlantFactory{ publicstaticfinalintAPPLE=1; publicstaticfinalintBANANA=2; publicstaticfinalintORANGE=3; @Override publicFruitgetFruit(intfruitType){ if(fruitType==APPLE){ returnnewApple(); } if(fruitType==BANANA){ returnnewBanana(); } if(fruitType==ORANGE){ returnnewOrange(); } returnnull; } @Override VegetablegetVegetable(intvegetableType){ //TODOAuto-generatedmethodstub returnnull; } }
蔬菜工厂:
publicclassVegetableFactoryextendsPlantFactory{ publicstaticfinalintCABBAGE=1; publicstaticfinalintTOMATO=2; publicstaticfinalintEGGPLANT=3; @Override FruitgetFruit(intfruitType){ //TODOAuto-generatedmethodstub returnnull; } @Override publicVegetablegetVegetable(intvegetableType){ //TODOAuto-generatedmethodstub if(vegetableType==CABBAGE){ returnnewCabbage(); } if(vegetableType==TOMATO){ returnnewTomato(); } if(vegetableType==EGGPLANT){ returnnewEggplant(); } returnnull; } }
可以看到,它们都是属于种植物这一类,所以都是继承了种植工厂类
publicabstractclassPlantFactory{ abstractFruitgetFruit(intfruitType); abstractVegetablegetVegetable(intvegetableType); }
最后,提供一个工厂生产器,即生产工厂的工厂:
publicclassPlantation{ publicstaticfinalintFRUIT=1; publicstaticfinalintVEGETABLE=2; publicstaticPlantFactorygetFactory(intfactoryType){ if(factoryType==FRUIT){ returnnewFruitFactory(); } if(factoryType==VEGETABLE){ returnnewVegetableFactory(); } returnnull; } }
好吧,写个main测试下:
publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub FruitFactoryfruitFactory=(FruitFactory)Plantation.getFactory(Plantation.FRUIT); Appleapple=(Apple)fruitFactory.getFruit(FruitFactory.APPLE); apple.printInfo(); VegetableFactoryvegetableFactory=(VegetableFactory)Plantation.getFactory(Plantation.VEGETABLE); Tomatotomato=(Tomato)vegetableFactory.getVegetable(VegetableFactory.TOMATO); tomato.printInfo(); }
结果:
苹果 西红柿
虽然工厂设计模式在获取产品类时很方便,但实际上产品的需求越严格,那么内部系统则越发庞大复杂,对于生产一些小产品来说,使用这么复杂庞大的系统反而浪费资源。
总结
以上就是本文关于Java设计模式笔记之抽象工厂代码示例的全部内容。代码是一个人主观意志的客观反映。。。胡扯了,参考别人写的代码,另外,多看看源码也是有好处的,学习别人实现某个功能的设计思路,来提高自己的编程水平。欢迎参阅:Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解、Java单例模式实现静态内部类方法示例等,有什么问题可以随时留言,欢迎大家交流讨论。