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

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

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

  1. 创建模式(简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、多例模式、建造模式、原始模型模式)
  2. 结构模式(适配器模式、缺省适配模式、合成模式、装饰模式、代理模式、享元模式、门面模式、桥梁模式)
  3. 行为模式(不变模式、策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、解释器模式、调停者模式
本文要讲述第一个设计模式(其他设计模式请参考我的其他博客),简单工厂模式,它是创建模式中最基本的模式,创建模式是对类的实例化过程的抽象化,一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建模式描述了怎样构造和封装这些动态的决定。
举例说明,比如有一个农场,专门向市场销售各种水果。在这个系统里需要描述下列水果
  • 葡萄 Grape
  • 草莓 Strawberry
  • 苹果 Apple
水果和其他的植物有很大不同,水果最终是可以采摘食用的。那么很自然地做法就是建立一个各种水果都适用的通用接口,以便与农场里的其他植物区分开,如下UML图所示
Java设计模式之简单工厂模式(Simple Factory)_第1张图片
水果接口规定出所有的水果必须实现的接口,包括任何水果类必须具备的方法。种植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.FactoryTest
Apple is growing
Grape is growing
Strawberry is growing

Process finished with exit code 0
简单工厂模式是类的创建模式,这个模式的一般性结构如下图所示:
Java设计模式之简单工厂模式(Simple Factory)_第2张图片





你可能感兴趣的:(LearningInWHU,工厂模式,Java与模式,Java设计模式,简单工厂模式,创建模式)