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简单工厂模式是类的创建模式,这个模式的一般性结构如下图所示:
相关文章推荐
- 【JAVA设计模式】简单工厂模式(Simple Factory Pattern)
- Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)
- Java设计模式 -- 简单工厂模式(SimpleFactory)
- 浅谈 java 设计模式--简单工厂模式(Simple Factory pattern)
- Java设计模式:简单工厂模式(Simple Factory Pattern)
- java设计模式——简单工厂模式(Simple Factory Pattern)
- java设计模式(1):简单工厂模式(Simple Factory)
- 设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 简单工厂模式(Simple Factory Pattern) - Java实现
- JAVA设计模式(01):创建型-工厂模式【简单工厂模式】(Simple Factory)
- java设计模式---简单工厂模式(Simple Factory)
- Java设计模式--简单工厂模式【Simple Factory Pattern】
- Java设计模式 - 简单工厂模式(Simple Factory)
- JAVA设计模式之 简单工厂模式【Simple Factory Pattern】
- java设计模式(1):简单工厂模式(Simple Factory)
- JAVA设计模式(01):创建型-工厂模式【简单工厂模式】(Simple Factory)
- 设计模式(Design Pattern)之简单工厂模式(Simple Factory Pattern)
- 设计模式---1:DOTNet设计模式实例之简单工厂模式(Simple Factory Pattern)
- 三.创建型设计模式——Simple Factory Pattern(简单工厂模式)
- JAVA设计模式——简单工厂(Simple Factory)模式
- 设计模式-简单工厂模式(SimpleFactory-C#)