简单工厂模式:根据传入的参数决定出哪个对象,感觉上似乎Factory负责生产对象。简单工厂模式有抽象产品,具体产品和工厂三个角色,如完成一个用户画图的功能:
抽象产品:
package mode.factory.simple;
public abstract class Shape {
public abstract void draw();
}
具体产品:
package mode.factory.simple;
public class Line extends Shape{
@Override
public void draw() {
System.out.println("Line is drawed!");
}
}
package mode.factory.simple;
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("Rectangle is drawed!");
}
}
package mode.factory.simple;
public class Triangle extends Shape {
@Override
public void draw() {
System.out.println("Triangle is drawed!");
}
}
工厂:
package mode.factory.simple;
public class ShapeFactory {
public Shape createShape(int shape){
switch (shape) {
case 1:
return new Line();
case 2:
return new Triangle();
case 3:
return new Rectangle();
default:
return null;
}
}
}
使用:
package mode.factory.simple;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("Input Shape No.:");
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
int shapeNum = -1;
try {
shapeNum = Integer.parseInt(br.readLine());
} catch (NumberFormatException e) {
System.err.println("Can not recognize this shape");
} catch (IOException e) {e.printStackTrace();}
Shape shape = new ShapeFactory().createShape(shapeNum);
shape.draw();
}
}
这种存在的问题是工厂类和选择产出耦合性太高,改进:
1.增加一个抽象工厂类
package mode.factory.simple;
public interface IFactory {
Shape createShape();
}
2.增加具体的工厂实现类
package mode.factory.simple;
public class LineFactory implements IFactory{
@Override
public Shape createShape() {
return new Line();
}
}
package mode.factory.simple;
public class TriangleFactory implements IFactory{
@Override
public Shape createShape() {
return new Triangle();
}
}
3.把简单工厂模式中的逻辑移出来,改到Test类
package mode.factory.simple;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test2 {
public static void main(String[] args) {
System.out.println("Input Shape No.:");
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
int shapeNum = -1;
try {
shapeNum = Integer.parseInt(br.readLine());
} catch (NumberFormatException e) {
System.err.println("Can not recognize this shape");
} catch (IOException e) {e.printStackTrace();}
IFactory shapeFac = null;
switch(shapeNum){
case 1:shapeFac = new LineFactory(); break;
case 2:shapeFac = new TriangleFactory(); break;
default:
}
Shape shape = shapeFac.createShape();
shape.draw();
}
}
这样做的好处真的是显而易见,更好维护了。这种是工厂方法模式,工厂方法模式里包含抽象工厂,具体工厂,抽象产品,具体产品,抽象工厂定义规范,具体生产由具体工厂完成,可以看出,把简单工厂模式中的工厂类里的逻辑移出到客户端,使其耦合度更低,便于更好维护。加功能的话只需要改客户端即可。 工厂方法模式的改进就是抽象工厂模式了
3.抽象工厂模式:
例子没想出来,但抽象工厂也是根据工厂方法进化的, 工厂方法针对的是一个产品结构;而抽象工厂模式则需要面对多个产品,抽象工厂就是在工厂方法的基础上进一步推广,抽象工厂不好的地方是增加一个产品需要增加的类很多,一些常用的技巧就是利用简单工厂来改造,也常用反射和配置文件来简化代码。

大话设计模式抽象工厂的最终类图:
