设计模式之(工厂模式)3种
今天学习一下最常见也是最常用的一种设计模式,就是工厂模式。
工厂模式一般分为3种:
简单工厂模式
工厂方法模式
抽象工厂模式
简单工厂模式
简单工厂模式其实不是一种设计模式,反而比较像一种编程习惯。由于经常被使用,有些开发人员把这个误认为是“工厂模式”...
如下以Pizza为例
Pizza 种类很多,创建一个Pizza(抽象类)基类。
/** * Created by view_man on 2016/12/1. */ public abstract class Pizza { public abstract void prepare(); public abstract void create(); public abstract void finish(); }
CheesePizza,Pizza的一种
/** * Created by view_man on 2016/12/1. */ public class CheesePizza extends Pizza { @Override public void prepare() { System.out.println("CheesePizza prepare"); } @Override public void create() { System.out.println("CheesePizza create"); } @Override public void finish() { System.out.println("CheesePizza finish"); } }
PepperoniPizza,Pizza的一种
/** * Created by view_man on 2016/12/1. */ public class PepperoniPizza extends Pizza { @Override public void prepare() { System.out.println("PepperoniPizza prepare"); } @Override public void create() { System.out.println("PepperoniPizza create"); } @Override public void finish() { System.out.println("PepperoniPizza finish"); } }
Pizza工厂
/** * Created by view_man on 2016/12/1. */ public class PizzaFactory { public static final String CHEESEPIZZA = "CheesePizza"; public static final String PEPPERONIPIZZA = "PepperoniPizza"; public Pizza createPizza(String type){ Pizza pizza = null; if (type.equals(CHEESEPIZZA)){ pizza = new CheesePizza(); }else if (type.equals(PEPPERONIPIZZA)){ pizza = new PepperoniPizza(); } return pizza; } }
Pizza商店
/** * Created by view_man on 2016/12/1. */ public class PizzaStore { private PizzaFactory pizzaFactory; public PizzaStore(PizzaFactory pizzaFactory) { this.pizzaFactory = pizzaFactory; } public void orderPizza(String type) { Pizza pizza = null; pizza = pizzaFactory.createPizza(type); if (pizza != null) { pizza.prepare(); pizza.create(); pizza.finish(); } else { System.out.println("No this type"); } } }
测试:
public class Main { public static void main(String[] args){ PizzaStore pizzaStore = new PizzaStore(new PizzaFactory()); pizzaStore.orderPizza(PizzaFactory.CHEESEPIZZA); pizzaStore.orderPizza(PizzaFactory.PEPPERONIPIZZA); } }
结果:
简单工厂模式比较简单,相信看代码都能明白,这里就不详细讲解。
工厂方法模式
定义:
工厂方法模式就是定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。
如下:
观察画红圈的地方,再和之前的对比,你就不难看出简单工厂和工厂方法的区别了。
createPizza(String type)
此方法就如同一个工厂,将实例化的责任转移到一个方法中。
具体怎么做由子类去决定。注意红圈的地方。
测试:
结果:
注意红圈的地方,大家好好对比着看,相信很快就能理解。
抽象工厂模式
抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要关心实际产出的产品类型具体是什么,这样,客户就从具体的产品中解耦出来。
定义:
抽象工厂模式就是提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
说到抽象工厂模式,其实它就是把工厂抽象出去,如下:
对于客户(这里指BJCheesePizza)而言,不需要关心实际产出的产品类型具体是什么,注意红圈的位置。
在实际生产中,我们通过传不同的工厂即可生产不同的Pizza,对于客户(这里指Pizza的实例,需要大家细细体会)而言,无论传哪种工厂,它接收的始终是PizzaFactoryInterface,所以不需要关心实际产出的产品类型具体是什么。
测试:
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/2a8959537966144aa8d98c523732e797.png)
总结:
1、所有的工厂都是封装对象的创建。
2、简单工厂,虽然不是真正的设计模式,但仍不失为一个简单方法,将客户程序从具体类解耦。
3、工厂方法通过继承,把对象的创建委托给子类,子类实现工厂方法创建对象。
4、抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中。
5、依赖导致原则,避免依赖具体类型,要尽量依赖抽象。
微信:feifie254
QQ:645139778
csdn:http://blog.csdn.net/qq645139778 或者(搜索 view-man)
GitHub:https://github.com/view-man
知乎:view-man
关注公众号:孙益飞