工厂模式几种形态
工厂模式专门负责将大量有共有接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类.工厂模式的3中形态
简单工厂模式(Simple Factory)-简单原型
简单工厂模式主要由工厂(Creator)角色,抽象产品(Product)角色,具体产品(Concrete Product)角色组成
如果系统只有一个具体角色的话,可以省略掉抽象产品角色
在有些情况下,工厂角色可以由抽象产品角色扮演
如果抽象角色已经被省略,而工厂角色就可以与具体产品角色合并.换言之,一个产品类为自身的工厂
案例:绘图员系统
UML
/** * @Description By:抽象画图类接口 * @Date : Created in 16:29 2018/6/13 * @Author : zhou jiao */ public interface Shape { /** * 定义画图行为 */ void draw(); /** * 定义擦除行为 */ void erase(); }
/** * @Description By:正方形产品 * @Date : Created in 16:46 2018/6/13 * @Author : zhou jiao */ public class Square implements Shape { @Override public void draw() { System.out.println("画方形"); } @Override public void erase() { System.out.println("擦除方形"); } }
/** * @Description By:圆形产品 * @Date : Created in 16:43 2018/6/13 * @Author : zhou jiao */ public class Circle implements Shape { @Override public void draw() { System.out.println("画圆"); } @Override public void erase() { System.out.println("擦除圆"); } }
/** * @Description By:三角形产品 * @Date : Created in 16:49 2018/6/13 * @Author : zhou jiao */ public class Triangle implements Shape { @Override public void draw() { System.out.println("画三角形"); } @Override public void erase() { System.out.println("擦除三角形"); } }
public class ArtTracerFactory { public static Shape factory(String which) throws Exception { if("circle".equalsIgnoreCase(which)){ return new Circle(); } else if ("square".equalsIgnoreCase(which)) { return new Square(); } else if ("triangle".equalsIgnoreCase(which)) { return new Triangle(); } else { throw new Exception(which); } } }
public class ArtTracer { public static void main(String[] args) { try { Shape shape =ArtTracerFactory.factory("circle"); shape.draw(); shape.erase(); shape = ArtTracerFactory.factory("square"); shape.draw(); shape.erase(); shape = ArtTracerFactory.factory("triangle"); shape.draw(); shape.erase(); shape = ArtTracerFactory.factory("a"); shape.draw(); shape.erase(); } catch (Exception e) { e.printStackTrace(); } } }
比较经典的简单工厂模式在java的dateFormat类 其中抽象产品dataFormat也是工厂对象,产出自己的子类具体对象。通过getDateInstance()静态方法的重载获取不同的实例对象.具体细节可查看源码进行学习
简单工厂模式的优点
1.降低耦合
2.实现对责任的分割
简单工厂模式的缺点
1.当产品类有复杂的多层次等级结构时,工厂类的功能会极为庞大,导致系统在将来进行功能扩展时较为困难
2.由于简单工厂模式使用静态方法作为工厂方法,静态方法无法有子类继承
3.当增加新的产品时会增加其他的具体抽象角色,同时工厂角色也要增加对应的功能,导致耦合过高