工厂模式看了几天了,以前曾经有看过,不过没去细看,只是简单的返回一些对象,没考虑到底使用的是哪种对象,这几天翻了一
些资料,给搞晕了,好在今天翻到一个高手的BLOG,渐渐的清楚了,以下是引用的一些重点段落
1.1 简单工厂(Simple Factory)模式
简单工厂模式是类的创建,又叫静态工厂方法(Static Factory Methord)模式。简单工厂模式是由一个工厂对象决定创造哪一种产品类的实例。
1.1.1 工厂模式的几种形态
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态的决定将哪一个类实例化,工厂模式有以下几种形态:
简单工厂(Simple Factory)模式:又称静态工厂方法(Static Factory Methord)模式。
工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式。
抽象工厂(Abstract Factory)模式:又称工具箱(Kit或Toolkit)模式。
1.1.2 简单工厂模式的引进(一般模式)
比如有一个农场,生产各种水果,有苹果(Apple)、草莓(Strawberry)、葡萄(Grape);农场的园丁(FruitGardener)要根据客户的需求,提供相应的水果。下面看看是如何用简单工厂模式实现这个过程的,如下图:
比如有一个农场,生产各种水果,有苹果(Apple)、草莓(Strawberry)、葡萄(Grape);农场的园丁(FruitGardener)要根据客户的需求,提供相应的水果。下面看看是如何用简单工厂模式实现这个过程的,如下图:

1.1.2.1 产品接口-水果接口:Fruit.java
package factory.briefnessfactory;
public interface Fruit {
/**
* 种植
*/
void plant();
/**
* 生长
*/
void grow();
/**
* 收获
*/
void harvest();
}
1.1.2.2 产品-平果类:Apple.java
package factory.briefnessfactory;
public class Apple implements Fruit {
private int treeAge;
/**
* 种植
*/
public void plant() {
System.out.println("Apple has been planted.");
}
/**
* 生长
*/
public void grow() {
System.out.println("Apple is growing...");
}
/**
* 收获
*/
public void harvest() {
System.out.println("Apple has been harvested.");
}
/**
* @return 返回树龄
*/
public int getTreeAge() {
return treeAge;
}
/**
* 设置树龄
*/
public void setTreeAge(int treeAge) {
this.treeAge = treeAge;
}
}
1.1.2.3 产品-草莓类:Strawberry.java
package factory.briefnessfactory;
public class Strawberry implements Fruit {
/**
* 生长
*/
public void grow() {
System.out.println("Strawberry is growing...");
}
/**
* 收获
*/
public void harvest() {
System.out.println("Strawberry has been harvested.");
}
/**
* 种植
*/
public void plant() {
System.out.println("Strawberry has been planted.");
}
/**
* 辅助方法
*/
public static void log(String msg) {
System.out.println(msg);
}
}
1.1.2.4 产品-葡萄类:Grape.java
package factory.briefnessfactory;
public class Grape implements Fruit {
private boolean seedless; //是否有籽
/**
* 种植
*/
public void plant() {
System.out.println("Grape has been planted.");
}
/**
* 生长
*/
public void grow() {
System.out.println("Grape is growing...");
}
/**
* 收获
*/
public void harvest() {
System.out.println("Grape has been harvested.");
}
/**
* @return 是否有籽
*/
public boolean getSeedless() {
return seedless;
}
/**
* 有无籽的赋值方法
*/
public void setSeedless(boolean seedless) {
this.seedless = seedless;
}
/**
* 辅助方法
*/
public static void log(String msg) {
System.out.println(msg);
}
}
1.1.2.5 工厂-园丁类:FruitGardener.java
package factory.briefnessfactory;
public class FruitGardener {
/**
* 静态工厂方法
* @param which :具体的产品名称
* @return 一个水果对象
* @throws BadFruitException
*/
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");
}
}
}
1.1.2.6 工厂异常定义类:BadFruitException.java
package factory.briefnessfactory;
public class BadFruitException extends Exception {
public BadFruitException(String msg) {
super(msg); //调用父类的构造方法
}
}
1.1.2.7 一般工厂模式的测试类
package factory.briefnessfactory;
public class TestApp {
/**
* 测试方法
*/
private void test(String fruitName) {
try {
Fruit f = FruitGardener.factory(fruitName);
System.out.println("恭喜!生产了一个水果对象:" + fruitName);
} catch (BadFruitException e) {
System.out.println("对不起!工厂目前不能生产你所要的产品:" + fruitName);
System.out.println(e.getMessage()); //输出异常信息
e.printStackTrace(); //输出异常堆栈信息
}
}
/**
* 应用入口方法
*/
public static void main(String args[]) {
TestApp t = new TestApp();
t.test("apple");
t.test("grape");
t.test("strawberry");
t.test("car"); //此处会抛异常,水果工厂能生产car(轿车)吗!哈哈哈哈...
}
}
1.1.2.8 测试运行结果
恭喜!生产了一个水果对象:apple
恭喜!生产了一个水果对象:grape
恭喜!生产了一个水果对象:strawberry
对不起!工厂目前不能生产你所要的产品:car
Bad fruit request
factory.briefnessfactory.BadFruitException: Bad fruit request
at factory.briefnessfactory.FruitGardener.factory(FruitGardener.java:18)
at factory.briefnessfactory.TestApp.test(TestApp.java:9)
at factory.briefnessfactory.TestApp.main(TestApp.java:25)
1.1.3 简单工厂模式的一般性结构
总结一下,从上面的简单工厂模式的实现可以看到,简单工厂模式需要实现
工厂角色:园丁
抽象产品:水果接口
具体产品:苹果、葡萄、草莓
另外还一般还需要实现
工厂异常类
客户类
工厂角色:园丁
抽象产品:水果接口
具体产品:苹果、葡萄、草莓
另外还一般还需要实现
工厂异常类
客户类
1.1.4 简单工厂模式的实现
1.1.4.1 使用接口或者抽象类实现多层次的产品结构
工厂类可以有多个静态的工厂方法,分别用来生产不同的产品对象。
1.1.4.2 多个工厂方法
分别负责创建不同的产品对象,比如java.text.DateFormat类是其子类的工厂类,而DateFormat类就是提供了多个静态工厂方法。
分别负责创建不同的产品对象,比如java.text.DateFormat类是其子类的工厂类,而DateFormat类就是提供了多个静态工厂方法。
1.1.4.3 抽象产品角色的省略
如果系统仅有一个具体产品角色产品角色的话,那么就可以省略掉抽象产品角色。省略掉抽象产品角色后的简略类
如果系统仅有一个具体产品角色产品角色的话,那么就可以省略掉抽象产品角色。省略掉抽象产品角色后的简略类
本来想自己写,不过实在想不出有比这篇更具有说服力的了
其实还有一些东西没有贴出来,由于太多了,分开写,
来自:http://lavasoft.blog.51cto.com/62575/11345 大家可以自己去看看