1.什么是工厂模式
工厂模式提供了创建对象的最佳方式,在创建对象时不会对客户端暴露创建逻辑,并且通过一个共同的接口来指向创建的对象。
2.使用场景
在不同的条件下创建不同的实例,比如Spring使用了工厂模式管理Bean的创建、生命周期以及Bean与Bean之间的关系。
3.如何实现
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
4.优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
5.缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
6.应用示例以及UML
工厂模式 有三类:
- 普通工厂模式
- 多个工厂方法模式
- 静态工厂方法模式
代码示例:
创建多种几何图形,圆形、长方形、正方形
UML视图:
7.代码实现
7.1 接口 Shape
public interface Shape { /** * 绘画 */ void draw(); }
7.2 正方形Square
public class Square implements Shape{ @Override public void draw() { System.out.println("this is Square drawing"); } }
7.3 长方形Rectangle
public class Rectangle implements Shape{ @Override public void draw() { System.out.println("this is Rectangle drawing "); } }
7.4圆形Circle
public class Circle implements Shape{ @Override public void draw() { System.out.println("this is Circle drawing"); } }
7.5普通工厂方法OrdinaryShapeFactory
public class OrdinaryShapeFactory { public Shape getShape(String shapeType){ if("CIRCLE".equalsIgnoreCase(shapeType)){ return new Circle(); }else if("RECTANGLE".equalsIgnoreCase(shapeType)){ return new Rectangle(); }else if("SQUARE".equalsIgnoreCase(shapeType)){ return new Square(); }else{ return null; } } }
7.6 多个工厂方法MethodFactory
public class MethodFactory { /** * 创建圆形 * @return */ public Shape getCircleShape(){ return new Circle(); } /** * 创建长方形 * @return */ public Shape getRectangleShape(){ return new Rectangle(); } /** * 创建正方形 * @return */ public Shape getSquareShape(){ return new Square(); } }
7.7静态工厂方法StaticMethodFactory
public class StaticMethodFactory { /** * 创建圆形 * @return */ public static Shape getCircleShape(){ return new Circle(); } /** * 创建长方形 * @return */ public static Shape getRectangleShape(){ return new Rectangle(); } /** * 创建正方形 * @return */ public static Shape getSquareShape(){ return new Square(); } }8.测试类
8.1 普通工厂测试类
public class OrdinaryShapeFactoryTest { @Test public void test(){ OrdinaryShapeFactory ordinaryShapeFactory = new OrdinaryShapeFactory(); Shape circle = ordinaryShapeFactory.getShape("CIRCLE"); circle.draw(); Shape rectangle = ordinaryShapeFactory.getShape("RECTANGLE"); rectangle.draw(); Shape square = ordinaryShapeFactory.getShape("SQUARE"); square.draw(); } }
测试结果:
this is Circle drawing this is Rectangle drawing this is Square drawing
8.2 多个工厂方法测试类
public class MethodFactoryTest { @Test public void test(){ MethodFactory methodFactory = new MethodFactory(); Shape circle = methodFactory.getCircleShape(); circle.draw(); Shape rectangle = methodFactory.getRectangleShape(); rectangle.draw(); Shape square = methodFactory.getSquareShape(); square.draw(); } }
测试结果:
this is Circle drawing this is Rectangle drawing this is Square drawing
8.3 静态工厂测试类
public class StaticMethodFactoryTest { @Test public void test(){ Shape circle = StaticMethodFactory.getCircleShape(); circle.draw(); Shape rectangle = StaticMethodFactory.getRectangleShape(); rectangle.draw(); Shape square = StaticMethodFactory.getSquareShape(); square.draw(); } }
测试结果:
this is Circle drawing this is Rectangle drawing this is Square drawing