抽象工厂的典型应用是在gui设计中。为了在运行时方便地替换不同风格的gui设计,我们需要在上层把每种不同风格的gui的实现细节隐藏起来。我们不再显式地调用gui中的某个组件的构造函数,因为这样暴露了组件的实现。相反,我们为每一个风格提供一个“工厂”来生产该风格的“产品”。
抽象工厂可以看作是面向对象设计中常用的多态思想的扩展。普通的多态只是针对一个“产品”,如shape抽象类。而抽象工厂是针对一组“产品”。所以显得整齐划一。
在设计文件系统时,我们希望抽象的文件系统VFS和具体的文件系统分离。即在VFS中不涉及任何具体的文件系统。如果要添加一个新的文件系统,则只要添加几个源文件,然后编译成模块,就万事大吉了。为了达到这一目标,VFS的代码本身不应该涉及具体的文件系统 。VFS里需要构造dentry,inode,super block对象时,也应该想方设法地避免显式地调用构造函数。但是由于文件系统可以抽象出一些共同的要素和接口,如dentry,inode,super_block,这时我们想到了抽象工厂的设计模式。
每一类文件系统可以看作是“工厂”,而dentry,inode, super block可以看作是“产品”。那么,工厂在哪里呢?我们是在哪里创建”工厂”本身的呢?
我们知道文件访问的大概流程:
1.首先,我们得知道是哪个文件系统。然后,通过mount把文件系统安装到某个目录下。这个结构体就是:file_system_type。我们可以看一下ext2的 file_system_type1167 static struct file_system_type ext2_fs_type = {1168 .owner = THIS_MODULE,1169
抽象工厂可以看作是面向对象设计中常用的多态思想的扩展。普通的多态只是针对一个“产品”,如shape抽象类。而抽象工厂是针对一组“产品”。所以显得整齐划一。
在设计文件系统时,我们希望抽象的文件系统VFS和具体的文件系统分离。即在VFS中不涉及任何具体的文件系统。如果要添加一个新的文件系统,则只要添加几个源文件,然后编译成模块,就万事大吉了。为了达到这一目标,VFS的代码本身不应该涉及具体的文件系统 。VFS里需要构造dentry,inode,super block对象时,也应该想方设法地避免显式地调用构造函数。但是由于文件系统可以抽象出一些共同的要素和接口,如dentry,inode,super_block,这时我们想到了抽象工厂的设计模式。
每一类文件系统可以看作是“工厂”,而dentry,inode, super block可以看作是“产品”。那么,工厂在哪里呢?我们是在哪里创建”工厂”本身的呢?
我们知道文件访问的大概流程:
1.首先,我们得知道是哪个文件系统。然后,通过mount把文件系统安装到某个目录下。这个结构体就是:file_system_type。我们可以看一下ext2的 file_system_type1167 static struct file_system_type ext2_fs_type = {1168 .owner = THIS_MODULE,1169