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