什么是抽象工厂模式
上篇博客已经介绍了工厂模式,这里要介绍的是抽象工厂模式,它是工厂模式的父类工厂,可以创建其他的工厂。抽象工厂模式(Abstract Factory Pattern)是另一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。抽象工厂模式其实就是在工厂模式之上增加了一层抽象的概念。
代码实现
创建两个工厂分别是画图的工厂ShapeFactory和填充颜色的工厂ColorFactory,再创建超级工厂FactoryProducer通过这个超级工厂来创建这两个工厂 。

1.定义形状接口,表示画不同形状的图形。实现它的3个类中都要实现它的 draw() 方法;同理定义颜色接口,表示为图形填充不同颜色
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| public interface Shape { void draw(); }
public class Circle implements Shape { public void draw(){ System.out.println("画圆"); } }
public class Rectangle implements Shape { public void draw(){ System.out.println("画长方形"); } }
public class Square implements Shape { public void draw(){ System.out.println("画正方形"); } }
public interface Color { void fill(); }
public class Blue implements Color { public void fill(){ System.out.println("填充蓝色"); } }
public class Green implements Color { public void fill(){ System.out.println("填充绿色"); } }
public class Red implements Color { public void fill(){ System.out.println("填充红色"); } }
|
2.定义形状工厂类,并在类中定义获取形状对象的方法,根据传入的参数创建不同的对象 equalsIgnoreCase() 是字符串的方法,可以忽略大小写比较字符串是否相等;颜色工厂类同理,根据传入的参数(颜色)创建不同的对象。
- 首先定义一个抽象类,规定继承它的类必须实现的抽象方法
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 28 29 30 31 32 33 34 35 36 37 38 39 40
| public abstract class AbstractFactory { public abstract Color getColor(String color); public abstract Shape getShape(String shap); }
public class ShapeFactory extends AbstractFactory { public Shape getShape(String shapeType){ if(shapeType == null) return null; if(shapeType.equalsIgnoreCase("circle")){ return new Circle(); }else if(shapeType.equalsIgnoreCase("rectangle")){ return new Rectangle(); }else if(shapeType.equalsIgnoreCase("square")){ return new Square(); } return null; } public Color getColor(String Color){ return null; } }
public class ColoreFactory extends AbstractFactory { public Shape getShape(String shapType){ return null; } public Color getColor(String color){ if(color == null) return null; if(color.equalsIgnoreCase("red")){ return new Red(); }else if(color.equalsIgnoreCase("green")){ return new Green(); }else if(color.equalsIgnoreCase("blue")){ return new Blue(); } return null; } }
|
3.定义生成工厂类的类,即工厂类的构造器,通过传递形状或颜色信息来获取工厂。
1 2 3 4 5 6 7 8 9 10 11
| public class FactoryProducer { public static AbstractFactory getFatory(String choice){ if(choice.equalsIgnoreCase("shape")){ return new ShapeFactory(); }else if(choice.equalsIgnoreCase("color")){ return new ColoreFactory(); } return null; } }
|
4.主类。使用 FactoryProducer(工厂类构造类) 来创建 AbstractFactory(工厂类),通过传递不同类型信息来获取不同的实体类的对象。
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
| public class AbstractFactoryPatternDemo { public static void main(String[] args) { AbstractFactory shapeFactory = FactoryProducer.getFatory("shape"); Shape shape1 = shapeFactory.getShape("circle"); shape1.draw(); Shape shape2 = shapeFactory.getShape("RECTANGLE"); shape2.draw(); AbstractFactory colorFactory = FactoryProducer.getFatory("COLOR"); Color color1 = colorFactory.getColor("RED"); color1.fill(); Color color2 = colorFactory.getColor("Green"); color2.fill(); } }
|
抽象工厂模式应用
抽象工厂模式适合的结构:产品分为几个系列,在每个系列中,产品的布局是类似的,在一个系列中的某个产品,在另一个系列中有一个与之对应的产品。而不同几个系列中同一位置的产品可能是互斥的。它们可以根据不同的客户提供不同的解决方案
小结
为了弄清楚,先介绍两个概念:
产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如上述代码中 生产的形状、颜色,长方形属于形状类等级结构中,而红色则属于颜色产品等级结构中。
工厂方法模式:针对 一个产品等级结构。
抽象工厂模式:针对 多个产品等级结构,即产品族。
投喂我
写文不易,如果本文对你有帮助,点击Donate,微信和支付宝投喂我