详解设计模式:抽象工厂模式

2022-12-02 08:30:09 浏览数 (2)

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过工厂父类定义负责创建产品的公共接口,子类负责生产具体对象。可以理解为简单工程模式的升级,解决简单工厂模式的弊端。 ~ 本篇内容包括:关于 工厂方法模式、工厂方法模式 Demo。


文章目录
  • 一、关于 抽象工厂模式
    • 1、关于 抽象工厂模式
    • 2、简单工厂、工厂方法、抽象工厂模式对比
    • 3、关于 抽象工厂模式构成
    • 4、关于 抽象工厂模式的实现
    • 5、关于 抽象工厂模式的优缺点

  • 二、抽象工厂模式 Demo
    • 1、Demo 设计
    • 2、Demo 实现
    • 3、Demo 测试

一、关于 抽象工厂模式

1、关于 抽象工厂模式

抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。这里的抽象角色就是产品族。

Ps:产品族是具有相同属性的同类型产品。

抽象工厂,非常适合解决两个维度的组合产品的构造问题,取其中一个维度作为产品族,另外一个维度作为产品族中具体的多个产品。

2、简单工厂、工厂方法、抽象工厂模式对比
  • 简单工厂模式:一个工厂生产所有产品。
  • 工厂方法模式:每个工厂生产自己负责的具体产品。
  • 抽象工厂模式**:**抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级(一个系列)的产品。
3、关于 抽象工厂模式构成

抽象工厂的构成:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。。
  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式支持多个抽象产品。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一关系。
4、关于 抽象工厂模式的实现

首先,根据具体产品进行抽象,将它们的公共的代码进行抽象和提取后,封装在一个抽象产品中;

其次,根据抽象产品,将各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,每一个具体产品都是抽象产品的子类;

然后,提供一个抽象工厂类用于提供创建各种产品族产品的方法,在根据具体产品,实现相应的具体工厂类,实现创建对应产品的方法;

最后,客户端只需要调用具体工厂类的工厂方法可得到一个相应的具体产品对象。

5、关于 抽象工厂模式的优缺点

优点:

  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  • 保证减少工厂类和具体产品的类添加。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 工厂和抽象产品里加代码,又要在具体的里面加代码。


二、抽象工厂模式 Demo

1、Demo 设计

我们设计一个图形工厂,其中图形有多种颜色(红色、蓝色 …),还有多种形状(矩形、圆形 …),我们利用工厂实现红色矩形 和 蓝色圆形的生产。

# 角色

Shape(抽象形状类)、Retangle(矩形类)、Circle(圆形类)

Color(抽象颜色类)、Red(红色类)、Blue(蓝色类)

ShapeFactory(抽象工厂类)、RedRetangleFactory(红色矩形工厂)、BlueCircleFactory(蓝色圆形工厂)

# 实现

Shape 作为形状产品族的抽象父类、Color 作为颜色产品族的抽象父类,使用 ShapeFactory 抽象工厂类分别实现颜色和形状的设计,最后由具体工厂实现类返回具体的颜色和形状实现

2、Demo 实现

# Shape 形状类

代码语言:javascript复制
//抽象形状类
public abstract class Shape {
    public abstract void sayShape();
}

//矩形类
public class Retangle extends Shape {
    @Overide
    public void sayShape() {
        System.out.println("Hi, I'm Retangle!");
    }
}

//圆形类
public class Circle extends Shape {
    @Overide
    public void sayShape() {
        System.out.println("Hi, I'm Circle!");
    }
}

# Color 颜色类

代码语言:javascript复制
//抽象颜色类
public abstract class Color {
    public abstract void sayColor();
}

//红色类
public class Red extends Color {
    @Overide
    public void sayColor() {
        System.out.println("Hi, I'm Red!");
    }
}

//白色类
public class Blue extends Color {
    @Overide
    public void sayColor() {
        System.out.println("Hi, I'm Blue!");
    }
}

# ShapeFactory 工厂类

代码语言:javascript复制
//抽象工厂类
public abstract class ShapeFactory {

    public abstract Shape createShape();
    
    public abstract Color createColor();
}

//红色的矩
public class RedRetangleFactory extends ShapeFactory {

    @Overide
    public Shape createShape() {
        return new Retangle();
    }
    
    @Overide
    public Color createColor() {
        return new Red();
    }
}

//蓝色的圆
public class BuleCircleFactory extends ShapeFactory {

    @Overide
    public Shape createShape() {
        return new Circle();
    }
    
    @Overide
    public Color createColor() {
        return new blue();
    }
}
3、Demo 测试
代码语言:javascript复制
public class Client {
    public static void main(String[] args) {
        Color color;
      	Shape shape;
      	// 红色矩形
      	ShapeFactory factory = new RedRetangleFactory();
				color = factory.createColor();
      	shape = factory.createShape();
    }
}

0 人点赞