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.抽象工厂模式: 例子没想出来,但抽象工厂也是根据工厂方法进化的, 工厂方法针对的是一个产品结构;而抽象工厂模式则需要面对多个产品,抽象工厂就是在工厂方法的基础上进一步推广,抽象工厂不好的地方是增加一个产品需要增加的类很多,一些常用的技巧就是利用简单工厂来改造,也常用反射和配置文件来简化代码。 大话设计模式抽象工厂的最终类图: