【前言】
上次针对自己的理解书写一篇工厂模式的文章,后面对于工厂模式进行更加多的学习,于是了解到了抽象工厂模式。其实网上大多数人们都是抽象工厂模式是工厂模式的升级版本,虽然我并不知道所说的升级是什么意思,但是升级给我一种模糊的感觉。
学习了解抽象工厂模式还是不容易,我前前后后花了好几天去思考,阅览相关的代码例子,才对抽象工厂模式有一点了解。
为了准确理解升级这个词在工厂模式上的意思,我认为这样表示更好:多工厂模式(一个接口有多个工厂类,每个工厂类都可以创建接口的实例)
虽然理解了抽象工厂模式,但是我还是想不到在Android开发种和业务相互结合的应用情景,这个问题我会继续深入思考。
【特点】
1. 抽象工厂模式拥有工厂模式的特点
2.一个接口对应有多个工厂,可以归纳为一对多关系
3. 抽象工厂模式可以使代码逻辑清楚,但是接口增加分类会使多次需要修改和增加工厂类
【适用】
1.接口的业务实现产生分类的概念,每种分类都有对应的一个以上实现类。
【图解】
基本形式:
特殊形式:
【例子】
// 图片二值化接口(黑白化) public interface Binarization{ public Image getBinarizationImage(); } // 速度优先的算法(分类一) public abstract class SpeedBinarization implements Binarization{ } // 空间优先的算法(分类二) public abstract class SpaceBinarization implements Binarization{ } // 速度优先算法1 public class SpeedAlgorithm1 extends SpeedBinarization{ public Image getBinarizationImage(){ // do some thing } } // 速度优先算法2 public class SpeedAlgorithm2 extends SpeedBinarization{ public Image getBinarizationImage(){ // do some thing } } // 空间优先算法1 public class SpaceAlgorithm1 extends SpaceBinarization{ public Image getBinarizationImage(){ // do some thing } } // 空间优先算法2 public class SpaceAlgorithm2 extends SpaceBinarization{ public Image getBinarizationImage(){ // do some thing } }
// 抽象工厂 public interface BinarizationFactory{ public Binarization getBinarization(String name); } // 速度优先的工厂 public class SpeedFactory implements BinarizationFactory{ public Binarization getBinarization(String name){ if(name.equals("one")){ return new SpeedAlgorithm1(); }else if(name.equals("two")){ return new SpeedAlgorithm2(); } return null; } } // 空间优先的工厂 public class SpaceFactory implements BinarizationFactory{ public Binarization getBinarization(String name){ if(name.equals("one")){ return new SpaceAlgorithm1(); }else if(name.equals("two")){ return new SpaceAlgorithm2(); } return null; } }
// 抽象工厂创建器public class BinarizationFactoryCreator{ public static BinarizationFactory getFactory(String factory){ if(factory.equals("speed")){ return new SpeedFactory(); }else if(factory.equals("space")){ return new SpaceFactory(); } return null; } }