Java设计模式之简单工厂模式(Simple Factory)

来源:互联网 发布:java下载图片返回前台 编辑:程序博客网 时间:2024/06/05 19:14

【Java与模式】简单工厂模式(Simple Factory---吴义)

首先说明,Java与模式一系列的文章均是参考阎宏博士的《Java与模式》一书,加上自身的一些体会的探索,产生如下文章。在此,特意标明。再谈Java与模式,在学习模式之前简单工厂模式(Simple Factory),需了解具体的Java模型图UML图的意思,Java中UML图具体含义的讲解请参考我博客的其他文章,它类似于机械工程中的AUTO CAD设计图纸,Java设计模式大类分为

  1. 创建模式(简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、多例模式、建造模式、原始模型模式)
  2. 结构模式(适配器模式、缺省适配模式、合成模式、装饰模式、代理模式、享元模式、门面模式、桥梁模式)
  3. 行为模式(不变模式、策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、解释器模式、调停者模式
本文要讲述第一个设计模式(其他设计模式请参考我的其他博客),简单工厂模式,它是创建模式中最基本的模式,创建模式是对类的实例化过程的抽象化,一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建模式描述了怎样构造和封装这些动态的决定。
举例说明,比如有一个农场,专门向市场销售各种水果。在这个系统里需要描述下列水果
  • 葡萄 Grape
  • 草莓 Strawberry
  • 苹果 Apple
水果和其他的植物有很大不同,水果最终是可以采摘食用的。那么很自然地做法就是建立一个各种水果都适用的通用接口,以便与农场里的其他植物区分开,如下UML图所示
水果接口规定出所有的水果必须实现的接口,包括任何水果类必须具备的方法。种植plant(),生长grow(),以及收获harvest()。
这个水果接口的源代码如下所示:
package com.wuyi.creationalPattern;/** * Created on 2017/6/9 * * @author WuYi */public interface Fruit {    public void grow();    public void harvest();    public void plant();}
Apple类是水果的一种,实现接口Fruit的所有方法。另外,由于苹果是多年生植物,因此多出一个treeAge性质,来描述苹果树的树龄。下面是这个Apple类的源代码
package com.wuyi.creationalPattern;/** * Created on 2017/6/9 * * @author WuYi */public class Apple implements Fruit {    private int treeAge;    public int getTreeAge() {        return treeAge;    }    public void setTreeAge(int treeAge) {        this.treeAge = treeAge;    }    @Override    public void grow() {        log("Apple is growing");    }    @Override    public void harvest() {        log("Apple has been harvest");    }    @Override    public void plant() {        log("Apple has been planted");    }    /**     * 辅助方法     */    public static void log(String msg){        System.out.println(msg);    }}
同理,Grape类是水果的一种,但葡萄分为有籽和无籽两类,因此多出一个seedless属性。代码如下:
package com.wuyi.creationalPattern;/** * Created on 2017/6/9 * * @author WuYi */public class Grape implements Fruit{    private boolean seedless;    public boolean isSeedless() {        return seedless;    }    public void setSeedless(boolean seedless) {        this.seedless = seedless;    }    @Override    public void grow() {        log("Grape is growing");    }    @Override    public void harvest() {        log("Grape has been harvested");    }    @Override    public void plant() {        log("Grape has been planted");    }    /**     * 辅助方法     */    public static void log(String msg){        System.out.println(msg);    }}
Strawberry草莓类代码如下:
package com.wuyi.creationalPattern;/** * Created on 2017/6/9 * * @author WuYi */public class Strawberry implements Fruit{    @Override    public void grow() {        log("Strawberry is growing");    }    @Override    public void harvest() {        log("Strawberry has been harvested");    }    @Override    public void plant() {        log("Strawberry has been planted");    }    /**     * 辅助方法     */    public static void log(String msg){        System.out.println(msg);    }}
农场的园丁也是系统的一部分,自然要由一个合适的类来代表。这个类就是FruitGardener类(就是我们的工厂类了),FruitGardener类根据客户端的要求,创建出不同的水果对象,比如苹果Apple,葡萄Grape或草莓Strawberry的实例,而如果收不到合法的要求,就会抛出BadFruitException异常。BadFruitException异常类代码如下:
package com.wuyi.exception;/** * Created on 2017/6/10 * * @author WuYi */public class BadFruitException extends Exception{        public BadFruitException(String msg){            super(msg);        }}
FruitGardener园丁类的代码如下:
package com.wuyi.creationalPattern;import com.wuyi.exception.BadFruitException;import com.wuyi.staticMethodTest.A;/** * Created on 2017/6/9 * * @author WuYi */public class FruitGardener {    /**     * 静态工厂方法     *     */    public static Fruit factory(String which) throws BadFruitException {        if (which.equalsIgnoreCase("apple")){            return new Apple();        }        else if (which.equalsIgnoreCase("strawberry")){            return new Strawberry();        }        else if (which.equalsIgnoreCase("grape")){            return new Grape();        }        else {            throw new BadFruitException("Bad fruit request");        }    }}
测试类代码如下:
package com.wuyi.creationalPattern;import com.wuyi.exception.BadFruitException;/** * Created on 2017/6/10 * * @author WuYi */public class FactoryTest {    public static void main(String[] args) {        try {            Fruit apple = FruitGardener.factory("apple");            Fruit grape=FruitGardener.factory("grape");            Fruit strawBerry=FruitGardener.factory("strawberry");            apple.grow();            grape.grow();            strawBerry.grow();        } catch (BadFruitException e) {            e.printStackTrace();        }    }}
结果输出:
"D:\Java JDK1.7\bin\java" "-javaagent:D:\Idea\IntelliJ IDEA 2017.1\lib\idea_rt.jar=9689:D:\Idea\IntelliJ IDEA 2017.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\Java JDK1.7\jre\lib\charsets.jar;D:\Java JDK1.7\jre\lib\deploy.jar;D:\Java JDK1.7\jre\lib\ext\access-bridge-64.jar;D:\Java JDK1.7\jre\lib\ext\dnsns.jar;D:\Java JDK1.7\jre\lib\ext\jaccess.jar;D:\Java JDK1.7\jre\lib\ext\localedata.jar;D:\Java JDK1.7\jre\lib\ext\sunec.jar;D:\Java JDK1.7\jre\lib\ext\sunjce_provider.jar;D:\Java JDK1.7\jre\lib\ext\sunmscapi.jar;D:\Java JDK1.7\jre\lib\ext\zipfs.jar;D:\Java JDK1.7\jre\lib\javaws.jar;D:\Java JDK1.7\jre\lib\jce.jar;D:\Java JDK1.7\jre\lib\jfr.jar;D:\Java JDK1.7\jre\lib\jfxrt.jar;D:\Java JDK1.7\jre\lib\jsse.jar;D:\Java JDK1.7\jre\lib\management-agent.jar;D:\Java JDK1.7\jre\lib\plugin.jar;D:\Java JDK1.7\jre\lib\resources.jar;D:\Java JDK1.7\jre\lib\rt.jar;D:\Idea\Idea WorkSpace\Design_Principles_and_Patterns_In_Java\out\production\Design_Principles_and_Patterns_In_Java" com.wuyi.creationalPattern.FactoryTestApple is growingGrape is growingStrawberry is growingProcess finished with exit code 0
简单工厂模式是类的创建模式,这个模式的一般性结构如下图所示:






阅读全文
0 0
原创粉丝点击