工厂模式
Posted noino
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。
工厂模式: 应该有三类, 让我们循序渐进, 利用工厂模式来开一个pizza店
工厂模式是用来解决new 的问题. 当你new出一个对象的时候你想到的是什么? 想到的是"具体", 实在实例化一个具体类, 用的是实现, 而不是接口, 代码绑定具体类会让代码更脆弱,更缺乏弹性. --->针对接口编程, 可以隔离掉以后系统可能发生的一大堆改变; 为什么呢? 如果是针对接口写的, 可以通过多态, 它可以与任何新类实现该接口;
第一步: 简单工厂方法---> 就一个pizza店嘛, 然后从pizza工厂取pizza, 然后按照流程制作pizza
public class PizzaStore { public Pizza orderPizza() { Pizza pizza = new PizzaFactory().createPizza("chessPizza"); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } } public class PizzaFactory { /*传进来什么类型的pizza, 就返回什么类型的pizza/ public Pizza createPizza(String style) { Pizza pizza = null; if (style.equals("chessPizza")) { return new ChessPizza(); } else if (style.equals("seaFoodPizza")){ return new SeaFoodPizza(); } return pizza; } }
那么这里肯定有疑问了, 你不就把new 具体pizza的代码换了个地方吗? -----> 哈哈, 别忘了, 除了你这里可以用这个工厂, 其他地方也可以用这个工厂, 而且把所有的pizza对象都统一到工厂对象来管理了. 当然还有静态工厂, 静态工厂不能通过继承来改变创建对象的方法(缺点吧);
OK,到这里你已经成功开启了一家pizza店, 而且你也不需要自己生产pizaa,想要哪种类型的pizza问pizzaFactory要就行了.
2. 随着你的加盟店的扩大, 有newyork加盟店, chigaco加盟店, 不同的地区有不同口味的pizza, 当然可以给每个地区加盟店都配备一个自己专属工厂.
但你发现这些加盟店虽然用了你的工厂获取pizza对象, 可加工pizza的方式却不尽相同,为了统一pizza的加工流程, (希望把加盟店和创建pizza捆绑在一起的同时又使代码有一定的弹性), 该工厂方法出马了;
public abstract class PizzaStore { /*加盟点都来继承这个抽象的pizzaStore, 那么他们既可以随自己生产pizza, 又可以按照统一的流程加工pizza*/ public Pizza orderPizza(String type) { Pizza pizza; pizza = createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } /*将创建pizza的方法不再独立交给工厂, 而是抽象出来, 让子类去决定产生什么类型的pizza*/ protected abstract Pizza createPizza(String type); }
3.还有一个抽象工厂模式, 想象一下, 在pizza的prepare阶段, 使用不同的配料, 当然不能自己去new, 而是利用工厂方法, 让子类去判断用什么配料, 而这一套配料(其实就是一家族的对象), 可以交给配料工厂来生产-------->简单工厂 + 工厂方法 -----> 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类; 自己去感受吧
以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )