抽象工厂模式也是一种工厂模式,只是它生产的对象是工厂。
代码演示
第1步:创建Shape
的接口
Shape.java
1 public interface Shape {2 void draw();3 }
第2步:创建实现相同接口的具体类
Rectangle.java
1 public class Rectangle implements Shape {2 3 @Override4 public void draw() {5 System.out.println("Inside Rectangle::draw() method.");6 }7 }
Square.java
1 public class Square implements Shape {2 3 @Override4 public void draw() {5 System.out.println("Inside Square::draw() method.");6 }7 }
Circle.java
1 public class Circle implements Shape {2 3 @Override4 public void draw() {5 System.out.println("Inside Circle::draw() method.");6 }7 }
第3步:创建一个Colors
接口
Color.java
1 public interface Color {2 void fill();3 }
第4步:创建实现相同接口的具体类
Red.java
1 public class Red implements Color {2 3 @Override4 public void fill() {5 System.out.println("Inside Red::fill() method.");6 }7 }
Green.java
1 public class Green implements Color {2 3 @Override4 public void fill() {5 System.out.println("Inside Green::fill() method.");6 }7 }
Blue.java
1 public class Blue implements Color {2 3 @Override4 public void fill() {5 System.out.println("Inside Blue::fill() method.");6 }7 }
第5步:创建实现相同接口的具体类
AbstractFactory.java
1 public abstract class AbstractFactory {2 abstract Color getColor(String color);3 abstract Shape getShape(String shape) ;4 }
第6步:创建实现相同接口的具体类
创建工厂类,根据给定信息扩展AbstractFactory
以生成具体类的对象
ShapeFactory.java
1 public class ShapeFactory extends AbstractFactory { 2 3 @Override 4 public Shape getShape(String shapeType){ 5 6 if(shapeType == null){ 7 return null; 8 } 9 10 if(shapeType.equalsIgnoreCase("CIRCLE")){11 return new Circle();12 13 }else if(shapeType.equalsIgnoreCase("RECTANGLE")){14 return new Rectangle();15 16 }else if(shapeType.equalsIgnoreCase("SQUARE")){17 return new Square();18 }19 20 return null;21 }22 23 @Override24 Color getColor(String color) {25 return null;26 }27 }
ColorFactory.java
1 public class ColorFactory extends AbstractFactory { 2 3 @Override 4 public Shape getShape(String shapeType){ 5 return null; 6 } 7 8 @Override 9 Color getColor(String color) {10 11 if(color == null){12 return null;13 } 14 15 if(color.equalsIgnoreCase("RED")){16 return new Red();17 18 }else if(color.equalsIgnoreCase("GREEN")){19 return new Green();20 21 }else if(color.equalsIgnoreCase("BLUE")){22 return new Blue();23 }24 25 return null;26 }27 }
第7步:创建工厂生成器/生产器类,通过传递如Shape
或Color
等信息来获取工厂
FactoryProducer.java
1 public class FactoryProducer { 2 public static AbstractFactory getFactory(String choice){ 3 4 if(choice.equalsIgnoreCase("SHAPE")){ 5 return new ShapeFactory(); 6 7 }else if(choice.equalsIgnoreCase("COLOR")){ 8 return new ColorFactory(); 9 }10 11 return null;12 }13 }
第8步:使用FactoryProducer
来获取AbstractFactory
,以便通过传递类型等信息来获取具体类的工厂
AbstractFactoryPatternDemo.java
1 public class AbstractFactoryPatternDemo { 2 public static void main(String[] args) { 3 4 //get shape factory 5 AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); 6 7 //get an object of Shape Circle 8 Shape shape1 = shapeFactory.getShape("CIRCLE"); 9 10 //call draw method of Shape Circle11 shape1.draw();12 13 //get an object of Shape Rectangle14 Shape shape2 = shapeFactory.getShape("RECTANGLE");15 16 //call draw method of Shape Rectangle17 shape2.draw();18 19 //get an object of Shape Square 20 Shape shape3 = shapeFactory.getShape("SQUARE");21 22 //call draw method of Shape Square23 shape3.draw();24 25 //get color factory26 AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");27 28 //get an object of Color Red29 Color color1 = colorFactory.getColor("RED");30 31 //call fill method of Red32 color1.fill();33 34 //get an object of Color Green35 Color color2 = colorFactory.getColor("Green");36 37 //call fill method of Green38 color2.fill();39 40 //get an object of Color Blue41 Color color3 = colorFactory.getColor("BLUE");42 43 //call fill method of Color Blue44 color3.fill();45 }46 }
第9步:验证输出,结果如下
1 Inside Circle::draw() method.2 Inside Rectangle::draw() method.3 Inside Square::draw() method.4 Inside Red::fill() method.5 Inside Green::fill() method.6 Inside Blue::fill() method.