链接地址:http://www.xx566.com/detail/133.html
提到工厂模式,我们并不陌生,在23中设计模式中,有工厂方法(Factory Method)模式、抽象工厂(Abstract Factory)模式,都是工厂模式的形态,在这之外,还有一种简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,接下来,我们就来学习一下简单工厂模式。
简单工厂模式,其实算是工厂方法模式的一个特殊实现, 即由一个工厂对象决定创建出哪一种产品类的实例,我倒觉得更像是面向对象三大特点之一的封装,即把创建不同的产品类的方法进行封装,封装到一个工厂类里。首先,我们来看一下简单工厂模式的UML类图(来自百度百科):
从图中我们可能看到,简单工厂模式中包含三种角色,我们简单的介绍一下:
抽象产品(Product)角色:简单工厂模式所创建的对象的父类,抽象出所有实例的公共接口。
具体产品(Concrete Product)角色:是简单工厂模式的创建对象,工厂模式所创建的任何对象都是这个角色的实例。
工厂(Creator)角色:简单工厂模式的核心,负责实现创建所有实例的内部逻辑,工厂类在客户端的直接的调用下创建对象。
接下来,我们通过简单的代码实例来学习简单工厂模式,首先,我们拟定这样一个场景,我们是一个手机供应商,我们需要诸如IPhone、Nokia这样的手机设备,我们不会自己生产手机,我们打算从富士康这样的工厂直接拿货。
我们分析一下这个场景,富士康是一个工厂,他为我们提供各式各样的手机设备,不仅仅是IPhone、Nokia,可能还有HTC、小米等,这样看来手机设备是一个抽象的概念,我们首先抽象出一个接口,代码如下:
/** * 抽象手机设备接口 * User: Realfighter * Date: 2014/8/23 * Time: 22:49 */ public interface Mobile { public String brand();//手机品牌 public double price();//手机价格 }
接下来,我们需要对具体的设备进行设置,品牌价格等,具体如下:
/** * Nokia手机实例 * User: Realfighter * Date: 2014/8/23 * Time: 22:52 */ public class Nokia implements Mobile { @Override public String brand() { return "Nokia"; } @Override public double price() { return 3000.0; } } /** * Iphone手机实例 * User: Realfighter * Date: 2014/8/23 * Time: 22:52 */ public class Iphone implements Mobile { @Override public String brand() { return "Iphone"; } @Override public double price() { return 5000.0; } }
有了这些,我们就可以去寻找富士康这样的代工厂,帮我们生产设备了,如下:
/** * 富士康工厂 * User: Realfighter * Date: 2014/8/23 * Time: 22:54 */ public class Foxconn { /** * 生产手机方法 * * @return */ public static Mobile produce(String brand) { if ("Nokia".equals(brand)) { return new Nokia(); } else if ("Iphone".equals(brand)) { return new Iphone(); } return null; } }
过了不久,工期就到了,手机供应商找到富士康,开始交钱提货了,如下:
/** * 手机供应商 * User: Realfighter * Date: 2014/8/23 * Time: 22:58 */ public class Supplier { public static void main(String[] args) { //手机供应商需要Nokia手机 Mobile nokia = Foxconn.produce("Nokia"); System.out.println(nokia.price());//3000.0 //手机供应商需要Iphone手机 Mobile iphone = Foxconn.produce("Iphone"); System.out.println(iphone.price()); //5000.0 } }
总结:简单工厂模式非常的简单,虽然不属于23中设计模式的范畴,但在单例、备忘录等模式中均存在应用,所以也很重要。简单工厂模式的优点是直接负责产品 对象的创建,不再由客户端负责创建,实现了责任的分割,缺点是产品等级层次结构如果很复杂,相应的工厂类就会很庞大,有大量逻辑要在工厂类处理,使扩展变 得困难。