设计模式初探之静态工厂模式

来源:互联网 发布:gov.cn域名注册 编辑:程序博客网 时间:2024/06/06 04:48

       静态工厂模式也叫简单工厂模式。简单的说就是通过工厂类去创建产品(类),而不是让客户自己去创建产品(类)。这样带来的好处就是,让我们写出的代码更符合单一职责原则。客户类只要一个产品的对象,并不关心产品如何创建。而工厂类也只负责创建产品。

简单工厂涉及到几个元素产品抽象、具体产品、还有工厂,类图如下:


我们就以创建一辆汽车为例。现在我们有一个抽象的产品汽车,所以我们定义一个汽车的接口

package com.cat;public interface Cat {public void run();}
定义具体的产品,宝马汽车

package com.cat;public class Bmw implements Cat {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("宝马,跑起来");}}

奥迪汽车

public class Audi implements Cat {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("奥迪,跑起来");}}

按照我们原来的写法,即客户去创建具体的产品

public class Client{public static void main(String[] arg){Cat bmw = new Bmw();bmw.run();Cat audi = new Audi();audi.run();}}

现在我们用简单的工厂模式去做这样一个过程,显然,我们只需要新增一个工厂类

package com.cat;public class CatFactory {public static Cat createCat(String catName){Cat mCat = null;switch (catName) {case "Bmw":mCat = new Bmw();break;case "Audi":mCat = new Audi();break;}return mCat;}}

这样下来,具体的产品创建就交给了工厂去创建,客户只需对工厂说我需要一辆宝马,工厂就会给客户创建一俩宝马并返回给客户

public class Client{  public static void main(String[] arg){  Cat bmw = CatFactory.createCat("Bmw");bmw.run();}  }  
这么简单就实现简单工厂模式,哈哈,就是这么简单,然而,然而,这代码就完美了么,仔细想想,如果我们要新增一个奔驰汽车,这是,我们需要新增一个具体的奔驰汽车类,还需要修改CatFactory,汽车工厂类(这犯了开放-封闭原则的大忌啊)。

       开放-封闭原则:软件实体应该是可扩展的,而不可修改,也就是说,对扩展是开放的,对修改则是封闭的(来自百度百科)

                      精髓就是,对程序的改动,最好是通过新增代码,而不去修改原先已经稳定正常的代码(这里有一点风险,意味着修改可能会对以前的功能造成影响)。

       原来如此,那我们改怎么让我们新增奔驰汽车,只需新增奔驰汽车的具体产品,不需要修改工厂及之前的具体产品呢?答案就是反射。工厂类通过反射创建对象,当我们新增产品是就不需要修改工厂。我们将汽车工厂类修改为如下。

public class CatFactory {//汽车类的路径public static String catPath = "com.cat";//具体汽车品牌通过catName传进来public static Cat createCat(String catName){Cat mCat = null;String catDetailPath = catPath+catName;try {Class<Cat> catClazz = (Class<Cat>) Class.forName(catDetailPath);mCat = catClazz.newInstance();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return mCat;}}
这是我们无论新增什么汽车品牌,新增多少品牌都无需去改动原来的代码了,只需要新增具体的产品。

package com.cat;public class Benz implements Cat{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("奔驰,跑起来!");}}


客户调用

public class Client{  public static void main(String[] arg){  Cat benz = CatFactory.createCat("Benz");bmw.run();}  }  

静态工厂方法模式是一种相对简单的模式,也是我们编程是常用的模式。优点就是

        1、可以让客户不用知道具体对象的创建过程,而直接拿到具体对象。

         2、客户只需知道抽象产品,不需知道具体产品,这才一定程度上让客户和具体产品解耦。

网上关于静态工厂模式的更多文章: 简单工厂模式详解

如发现错误,请不吝赐教,后续将带来更多的设计模式。







原创粉丝点击