
前言讲工厂模式大家可能觉得会很Low不就是搞个类然后专门生成一个具体的对象嘛这有什么难的。是的工厂模式确实不难但是问你一下如果你的代码中有很多if...else你知道怎么通过工厂模式把这些if...else去掉么“嗯工厂模式我会但是和去掉if...else好像没有关系吧”我举个例子假如你遇到如下代码switch($taskInfo[type_id]) { //批量冻结订单 case 1: $result self::batchFrozen($row_key,1); break; //批量解冻订单 case 2: $result self::batchFrozen($row_key,0); break; //批量允许发货 case 3: $result self::batchReshipment($row_key); break; //批量取消发货 case 4: $result self::batchCancel($row_key); break; // 后面还有几十个case省略...既然你懂工厂模式可以把if...else简单重构一下那就开始你的表演吧。“什么不会你刚才还是自己是会工厂模式怎么突然就怂了呢”既然不会那就静下心来虚心学习一下。工厂模式工厂模式Factory Pattern是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。在工厂模式中我们在创建对象时不会对客户端暴露创建逻辑并且是通过使用一个共同的接口来指向新创建的对象。先直接上图后面的示例主要通过该图展开其实设计模式一般不会单一使用通常会和其它模式结合起来使用这里我们就将上一篇文章讲到的模板模式和工厂模式结合起来。因为工厂模式通常会给这些新创建的对象制定一个公共的接口我们可以通过抽象类定义public abstract class penguin { public void eating() { System.out.println(吃饭); } public void sleeping() { System.out.println(睡觉); } public abstract void beating(); public void everyDay() { this.eating(); this.sleeping(); this.beating(); } }因为我们是结合了模板模式所以这个抽象类中可以看到模板模式的影子如果你只关注抽象的接口比如beating那么这个就是一个抽象方法也可以理解为下游需要实现的方法其它的接口其实可以忽略。再看看每个企鹅具体的实现public class littlePenguin extends penguin { Override public void beating() { System.out.println(用小翅膀打豆豆); } } public class middlePenguin extends penguin { Override public void beating() { System.out.println(用圆圆的肚子打豆豆); } } public class bigPenguin extends penguin { Override public void beating() { System.out.println(拿鸡毛掸子打豆豆); } }这里就是工厂方法的重点了需要构建一个工厂专门用来拿企鹅public class penguinFactory { private static final MapString, penguin map new HashMap(); static { map.put(littlePenguin, new littlePenguin()); map.put(middlePenguin, new middlePenguin()); map.put(bigPenguin, new bigPenguin()); } // 获取企鹅 public static penguin getPenguin(String name) { return map.get(name); } }上面的逻辑很简单就是通过一个map对象放入所有的企鹅这个工厂就可以通过企鹅的名字拿到对应的企鹅对象最后我们看使用方式public class test { public static void main(String[] args) { penguin penguin_1 penguinFactory.getPenguin(littlePenguin); penguin_1.everyDay(); penguin penguin_2 penguinFactory.getPenguin(middlePenguin); penguin_2.everyDay(); penguin penguin_3 penguinFactory.getPenguin(bigPenguin); penguin_3.everyDay(); } }输出如下吃饭 睡觉 用小翅膀打豆豆 吃饭 睡觉 用圆圆的肚子打豆豆 吃饭 睡觉 拿鸡毛掸子打豆豆看到这里大家应该知道怎么去使用工厂模式了吧这里我是通过“工厂模式 模板模式”来讲的这个示例这样刚好可以和我上一篇文章融会贯通。“楼哥你这个例子我看懂了但是你最开始抛的那个问题能给出答案么”“不会吧这个示例其实已经很清楚了那我再讲述一下吧谁让楼哥是暖男呢。”问题解答文章开头的这个示例其实也是我最近需要重构项目中的一段代码我就是用“工厂模式 模板模式”来重构的我首先会对每个方法中的内容通过模板模式进行抽象因为本章主要讲工厂模式模板模式的代码我就不贴了然后通过工厂模式获取不同的对象直接看重构后的代码目前还是DEMO版public class TaskFactory { Autowired public static ListAbstractTask taskList; private static final MapString, AbstractTask map new HashMap(); static { // 存放任务映射关系 map.put(AbstractTask.OPERATOR_TYPE_FROZEN, new BatchFrozenTask()); map.put(AbstractTask.OPERATOR_TYPE_REJECT, new BatchRejectTask()); map.put(AbstractTask.OPERATOR_TYPE_CANCEL, new BatchCancelTask()); } public static void main(String[] args) { String operatorType AbstractTask.OPERATOR_TYPE_REJECT; AbstractTask task TaskFactory.map.get(operatorType); ParamWrapperCancelParams params new ParamWrapperCancelParams(); params.rowKey 11111111; params.data new CancelParams(); OcApiServerResponse res task.execute(params); System.out.println(res.toString()); return; } }实际场景这个场景就太多了刚才给大家讲解的是去掉if...else的场景然后在小米商城的支付系统中因为海外有几十种支付方式也是通过这种方式去掉if...else的不过支付类的封装不是用的模板方法用的的策略模式虽然感觉两者差不多。如果你直接new一个对象就能解决的问题就用不到工厂模式了。