什么是抽象工厂模式
上篇博客已经介绍了工厂模式,这里要介绍的是抽象工厂模式,它是工厂模式的父类工厂,可以创建其他的工厂。抽象工厂模式(Abstract Factory Pattern)是另一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。抽象工厂模式其实就是在工厂模式之上增加了一层抽象的概念。
代码实现
- 代码思路:
创建两个工厂分别是画图的工厂ShapeFactory和填充颜色的工厂ColorFactory,再创建超级工厂FactoryProducer通过这个超级工厂来创建这两个工厂 。
- UML类图(结合UML类图代码逻辑更为清晰)
![](https://img.haomeiwen.com/i8176895/29c7738dabc773f6.png)
1.定义形状接口,表示画不同形状的图形。实现它的3个类中都要实现它的 draw() 方法;同理定义颜色接口,表示为图形填充不同颜色
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() 是字符串的方法,可以忽略大小写比较字符串是否相等;颜色工厂类同理,根据传入的参数(颜色)创建不同的对象。
- 首先定义一个抽象类,规定继承它的类必须实现的抽象方法
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.定义生成工厂类的类,即工厂类的构造器,通过传递形状或颜色信息来获取工厂。
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(工厂类),通过传递不同类型信息来获取不同的实体类的对象。
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
//获取形状工厂
AbstractFactory shapeFactory = FactoryProducer.getFatory("shape");
//获取形状为Cirlce的对象
Shape shape1 = shapeFactory.getShape("circle");
// 画圆
shape1.draw();
//获取形状为 Rectangle 的对象
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//调用 Rectangle 的 draw 方法
shape2.draw();
//获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.getFatory("COLOR");
//获取颜色为 Red 的对象
Color color1 = colorFactory.getColor("RED");
//调用 Red 的 fill 方法
color1.fill();
//获取颜色为 Green 的对象
Color color2 = colorFactory.getColor("Green");
//调用 Green 的 fill 方法
color2.fill();
}
}
抽象工厂模式应用
抽象工厂模式适合的结构:产品分为几个系列,在每个系列中,产品的布局是类似的,在一个系列中的某个产品,在另一个系列中有一个与之对应的产品。而不同几个系列中同一位置的产品可能是互斥的。它们可以根据不同的客户提供不同的解决方案
小结
- 工厂模式和抽象工厂模式区别:
为了弄清楚,先介绍两个概念:
产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如上述代码中 生产的形状、颜色,长方形属于形状类等级结构中,而红色则属于颜色产品等级结构中。
工厂方法模式:针对 一个产品等级结构。
抽象工厂模式:针对 多个产品等级结构,即产品族。
关于作者
个人博客: http://yhch.xyz
网友评论