详解设计模式:抽象工厂模式
创始人
2024-02-17 11:39:08
0

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

本篇内容包括:关于 工厂方法模式、工厂方法模式 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 形状类

//抽象形状类
public abstract class Shape {public abstract void sayShape();
}//矩形类
public class Retangle extends Shape {@Overidepublic void sayShape() {System.out.println("Hi, I'm Retangle!");}
}//圆形类
public class Circle extends Shape {@Overidepublic void sayShape() {System.out.println("Hi, I'm Circle!");}
}

# Color 颜色类

//抽象颜色类
public abstract class Color {public abstract void sayColor();
}//红色类
public class Red extends Color {@Overidepublic void sayColor() {System.out.println("Hi, I'm Red!");}
}//白色类
public class Blue extends Color {@Overidepublic void sayColor() {System.out.println("Hi, I'm Blue!");}
}

# ShapeFactory 工厂类

//抽象工厂类
public abstract class ShapeFactory {public abstract Shape createShape();public abstract Color createColor();
}//红色的矩
public class RedRetangleFactory extends ShapeFactory {@Overidepublic Shape createShape() {return new Retangle();}@Overidepublic Color createColor() {return new Red();}
}//蓝色的圆
public class BuleCircleFactory extends ShapeFactory {@Overidepublic Shape createShape() {return new Circle();}@Overidepublic Color createColor() {return new blue();}
}

3、Demo 测试

public class Client {public static void main(String[] args) {Color color;Shape shape;// 红色矩形ShapeFactory factory = new RedRetangleFactory();color = factory.createColor();shape = factory.createShape();}
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...