您的位置:首页 > 编程语言 > Java开发

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

2017-06-09 23:00 495 查看

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

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

创建模式(简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、多例模式、建造模式、原始模型模式)
结构模式(适配器模式、缺省适配模式、合成模式、装饰模式、代理模式、享元模式、门面模式、桥梁模式)
行为模式(不变模式、策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、解释器模式、调停者模式
本文要讲述第一个设计模式(其他设计模式请参考我的其他博客),简单工厂模式,它是创建模式中最基本的模式,创建模式是对类的实例化过程的抽象化,一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建模式描述了怎样构造和封装这些动态的决定。
举例说明,比如有一个农场,专门向市场销售各种水果。在这个系统里需要描述下列水果

葡萄 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.FactoryTest
Apple is growing
Grape is growing
Strawberry is growing

Process finished with exit code 0
简单工厂模式是类的创建模式,这个模式的一般性结构如下图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息