抽象工厂模式
Overview
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。
每个生成的工厂都能按照工厂模式
提供对象。
主要解决
主要解决接口选择的问题。
何时使用
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
应用实例
优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
实现
Shape and Subclass
Shape interface
1 2 3 4 5 6 7 8 9 10 11 package individual.cy.learn.pattern.creational.abstractfactory;public interface GeometricShape { void draw () ; }
ShapeType2D
1 2 3 4 5 6 7 8 9 10 11 package individual.cy.learn.pattern.creational.abstractfactory;public enum ShapeType2D { LINE, CIRCLE, SQUARE }
ShapeType3D
1 2 3 4 5 6 7 8 9 10 11 package individual.cy.learn.pattern.creational.abstractfactory;public enum ShapeType3D { SPHERE, CUBE, CYLINDER }
2D Shape
Line
1 2 3 4 5 6 7 8 9 10 11 package individual.cy.learn.pattern.creational.abstractfactory;public class Line implements GeometricShape { @Override public void draw () { System.out.println("Line.draw" ); } }
Circle
1 2 3 4 5 6 7 8 9 10 11 12 package individual.cy.learn.pattern.creational.abstractfactory;public class Circle implements GeometricShape { @Override public void draw () { System.out.println("Circle.draw" ); } }
Square
1 2 3 4 5 6 7 8 9 10 11 package individual.cy.learn.pattern.creational.abstractfactory;public class Square implements GeometricShape { @Override public void draw () { System.out.println("Square.draw" ); } }
3D Shape
Cude
1 2 3 4 5 6 7 8 9 10 11 package individual.cy.learn.pattern.creational.abstractfactory;public class Cube implements GeometricShape { @Override public void draw () { System.out.println("Cube.draw" ); } }
Sphere
1 2 3 4 5 6 7 8 9 10 11 package individual.cy.learn.pattern.creational.abstractfactory;public class Sphere implements GeometricShape { @Override public void draw () { System.out.println("Sphere.draw" ); } }
Cylinder
1 2 3 4 5 6 7 8 9 10 11 package individual.cy.learn.pattern.creational.abstractfactory;public class Cylinder implements GeometricShape { @Override public void draw () { System.out.println("Cylinder.draw" ); } }
Factory
Abstract Factory
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package individual.cy.learn.pattern.creational.abstractfactory;public abstract class AbstractFactory { public abstract GeometricShape getGeometricShape2D (ShapeType2D type) ; public abstract GeometricShape getGeometricShape3D (ShapeType3D type) ; }
Two Dimension Shape Factory
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package individual.cy.learn.pattern.creational.abstractfactory;public class TwoDimensionShapeFactory extends AbstractFactory { @Override public GeometricShape getGeometricShape2D (ShapeType2D type) { switch (type) { case LINE: return new Line (); case CIRCLE: return new Circle (); case SQUARE: return new Square (); default : return null ; } } @Override public GeometricShape getGeometricShape3D (ShapeType3D type) { return null ; } }
Three Dimension Shape Factory
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package individual.cy.learn.pattern.creational.abstractfactory;public class ThreeDimensionShapeFactory extends AbstractFactory { @Override public GeometricShape getGeometricShape2D (ShapeType2D type) { return null ; } @Override public GeometricShape getGeometricShape3D (ShapeType3D type) { switch (type) { case SPHERE: return new Sphere (); case CUBE: return new Cube (); case CYLINDER: return new Cylinder (); default : return null ; } } }
Factory Creator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package individual.cy.learn.pattern.creational.abstractfactory;import java.util.function.Supplier;public enum FactoryCreator { TWO_D_SHAPE_FACTORY(TwoDimensionShapeFactory::new ), THREE_D_SHAPE_FACTORY(ThreeDimensionShapeFactory::new ); private final Supplier<AbstractFactory> factorySupplier; FactoryCreator(Supplier<AbstractFactory> factorySupplier) { this .factorySupplier = factorySupplier; } public AbstractFactory getInstance () { return factorySupplier.get(); } public static AbstractFactory getFactory (FactoryCreator creator) { return creator.getInstance(); } }
Tester
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package individual.cy.learn.pattern.creational.abstractfactory;public class AbstractFactoryPatternTester { public static void main (String[] args) { FactoryCreator.TWO_D_SHAPE_FACTORY .getInstance() .getGeometricShape2D(ShapeType2D.LINE) .draw(); FactoryCreator.THREE_D_SHAPE_FACTORY .getInstance() .getGeometricShape3D(ShapeType3D.CYLINDER) .draw(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 13:18:52: Executing task 'AbstractFactoryPatternTester.main()'... Configuration on demand is an incubating feature. > Task :compileJava > Task :processResources NO-SOURCE > Task :classes > Task :AbstractFactoryPatternTester.main() Line.draw Cylinder.draw BUILD SUCCESSFUL in 1s 2 actionable tasks: 2 executed 13:18:54: Task execution finished 'AbstractFactoryPatternTester.main()'.