一起来学设计模式-----创建型模式之抽象工厂

学习了简单工厂,工厂方法模式,那什么是抽象工厂呢?工厂方法模式是在超类(IFactory)中定义一个工厂的抽象接口(CreateOperation),然后由子类负责创建具体对象;而抽象工厂则是维护一个产品家族,由子类定义产品被产生的方法,客户根据超类的接口开发。目前简单的理解,抽象工厂更多的就是基于多种产品的抽象和对象的创建。

假设系统里有一个用户表,需求是插入和选择用户时根据用户的需求,可以保存在mysql 数据库或者Access数据库中,这时用工厂方法模式应该怎么样实现呢?

首先使用面向对象的概念进行业务抽象,用户是一个类,使用mysql操作用户表是一个具体实践类,使用Access操作用户表是一个具体的实践类,操作类可以抽象成一个接口IUser类,根据工厂方法模式,则每个实践类都需要一个实际工厂是实例化,则需要2个具体工厂,这2个具体的工厂又能抽象一个接口IFactory类。客户端就可以根据实际情况,选择使用具体的工厂,创造出具体的类,操作user表。代码实现如下:


from abc import ABCMeta, abstractmethod

class User:    def __int__(self,id):        self.id = id

class IUser:    @abstractmethod    def InsertUser(self,user):        pass

@abstractmethod    def GetUser(self,id):        pass

class IFactory:    @abstractmethod    def CreateUser(self):        pass
class AccessUser(IUser):
    def InsertUser(self,user):
        print ("在access中为User表增加一条记录")

    def GetUser(self,id):
        print ("在access中为User表查询一条记录")

class MysqlUser(IUser):
    def InsertUser(self,user):
        print ("在mysql中为User表增加一条记录")

    def GetUser(self,id):
        print ("在mysql中为User表查询一条记录")
class MysqlFactory(IFactory):    def CreateUser(self):        return MysqlUser()

class AccessFactory(IFactory):    def CreateUser(self):        return AccessUser()

客户端调用的代码如下:

if __name__ == ‘__main__‘:
     user = User()
     factory = MysqlFactory()
     iu = factory.CreateUser()
     iu.InsertUser(user)
     iu.GetUser(1)

UML类图:

如果此时,再加一个Department表,业务类似User一样的增加,在工厂类中,增加工厂创建实例对象的方法即可。则UML类图应该是下面这样的:

代码实现如下:

class User:
    def __int__(self,id):
        self.id = id

class Department:
    def __int__(self,depName):
        self.depName = depName

class IUser:
    @abstractmethod
    def InsertUser(self,user):
        pass

    @abstractmethod
    def GetUser(self,id):
        pass

class IDepartment:
    @abstractmethod
    def InsertDepartment(self,dep):
        pass

    @abstractmethod
    def GetDepartment(self,depname):
        pass

class IFactory:
    @abstractmethod
    def CreateUser(self):
        pass

    @abstractmethod
    def CreateDepartment(self):
        pass

class AccessUser(IUser):
    def InsertUser(self,user):
        print ("在access中为User表增加一条记录")

    def GetUser(self,id):
        print ("在access中为User表查询一条记录")

class MysqlUser(IUser):
    def InsertUser(self,user):
        print ("在mysql中为User表增加一条记录")

    def GetUser(self,id):
        print ("在mysql中为User表查询一条记录")

class AccessDepartment(IDepartment):
    def InsertDepartment(self,dep):
        print ("在access中为Department表增加一条记录")

    def GetDepartment(self,id):
        print ("在access中为Department表查询一条记录")

class MysqlDepartment(IDepartment):
    def InsertDepartment(self,dep):
        print ("在mysql中为Department表增加一条记录")

    def GetDepartment(self,id):
        print ("在mysql中为Department表查询一条记录")
class MysqlFactory(IFactory):
    def CreateUser(self):
        return MysqlUser()

    def CreateDepartment(self):
        return MysqlDepartment()

class AccessFactory(IFactory):
    def CreateUser(self):
        return AccessUser()

    def CreateDepartment(self):
        return AccessDepartment()

客户端代码如下:

if __name__ == ‘__main__‘:
     user = User()
     factory = MysqlFactory()
     iu = factory.CreateUser()
     iu.InsertUser(user)
     iu.GetUser(1)

     dep = Department()
     asFactory = AccessFactory()
     idep = asFactory.CreateDepartment()
     idep.InsertDepartment(dep)
     idep.GetDepartment(‘loleina‘)

这么一看,就已经实现了抽象工厂方法,工厂方法模式是定义一个用于创建对象的接口(IFactory),让子类(MysqlFactory,AccessFactory)去决定实例化哪一个类。而抽象工厂,是提供一个创建一系列相关或相互依赖对象的接口(IFactory内可以有多个产品的抽象),而无须指定它们的具体的类。

抽象工厂最大的好处就是,客户端可以根据自己的需求,从不同的工厂中获取不同的产品对象,从而得到不同的产品。但是这个模式实际也是有很多缺点的,比如思考下此时加入一个新的表,要改动哪些呢?

下面以UML类图变化为例。灰色部分表示需要修改的地方。工厂类就得全部修改一遍。。。

相比如果增加一个工厂,代价是相对还少点。

实际在真正的项目使用上,根据我进鹅厂看了这么多的业务代码经验,这类设计模式一般是不会被才采用到的,一般都是使用反射 + 配置文件(DB配置)+ 简单工厂来实现,这样增加产品类型时,只需要增加响应的产品,增加相关的配置,而无须修改任何代码。使用这个思路修改这个例子。

代码实现如下:

class DateAccess:
    @staticmethod
    def CreateUser():        #DBType和DBTableName来自于配置文件或者DB配置
        DBType = ‘Mysql‘
        DBTableUser = ‘User‘
        instanceName = DBType +DBTableUser
        return eval(instanceName)()

    @staticmethod
    def CreatDepartment():
        DBType = ‘Mysql‘
        DBTableDep = ‘Department‘
        instanceName = DBType + DBTableDep
        return eval(instanceName)()

客户端调用如下:

if __name__ == ‘__main__‘:
     user = User()
     iu = DateAccess.CreateUser()
     iu.InsertUser(user)
     iu.GetUser(1)

     dep = Department()
     idep =DateAccess.CreatDepartment()
     idep.InsertDepartment(dep)
     idep.GetDepartment(‘test‘)
时间: 2024-10-14 03:50:30

一起来学设计模式-----创建型模式之抽象工厂的相关文章

【C#设计模式——创建型模式】抽象工厂模式

抽象工厂模式比工厂模式具有更高层次的抽象性.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以选择这种模式.直接进入示例. 示例描述:完成花园的规划,多种花园种类,每个里面多种植物 编写一个基类Garden,Garden就是抽象工厂.它定义了具体类中的方法,并返回一系列相关类中的某个类. public class Garden { protected Plant center, shade, border; protected bool showCenter, showS

一起来学设计模式-----创建型模式之简单工厂

一直都特别想整体学习下设计模式,之前总觉得不是时候,觉得基础不够好怕吸收不了,或者体会不到设计模式带来的便利.就在上半年的KPI编写测试桩项目中,我就深刻的感受到设计模式带来的好处.一般测试人员写的代码不是很多,很多时候写代码也都是基于解决问题的逻辑来的,写的代码面向过程思路较多,因此代码的冗余度特别大.在编写一个大的测试工具时,就更应该考虑这方面的问题自己是否存在.刻不容缓的学习起了设计模式,整理就从创建型模式的工厂模式开始入手吧. 创建型模式,共三种:工厂方法模式.建造者模式.原型模式.其中

设计模式——创建型模式之抽象工厂模式(四)

模式的定义与特点 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 使用抽象工厂模式一般要满足以下条件. 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品. 系统一次只可能消费其中某一族产品,即同族的产品一起使用. 抽象工厂模式除了具有工

创建型模式:抽象工厂

个人博客原文: 创建型模式:抽象工厂 五大创建型模式之三:抽象工厂. 简介 姓名 :抽象工厂 英文名 :Abstract Factory Pattern 价值观 :不管你有多少产品,给我就是了 个人介绍 : Provide an interface for creating families of related or dependent objects without specifying their concrete classes. 为创建一组相关或相互依赖的对象提供一个接口,而且无须指定

【设计模式】创建型模式之抽象工厂Abstract Factory

抽象工厂Abstract Factory是一种创建型设计模式,目的在于提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.抽象工厂的类图如下,客户仅与抽象类定义的定义的接口交互,而不使用特定的具体类的接口.一个系统包含多种产品时,AbstractFactory声明创建各种抽象产品对象的操作接口,这些接口是直接暴露给Client的,而具体产品对象的创建则延迟到子类ConcreteFactory,Client面对的产品类是AbstractProduct,无需关系具体产品类是什么.在运

一起来学设计模式-----创建型模式之工厂方法

工厂方法模式,在简单工厂上再深一层,简单工厂里有一个弊端,就是在方法里是根据用户的输入直接返回子类对象.在工厂方法里,定义了一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到了子类. 以之前的操作运算为例,使用工厂方法代码如下: from abc import ABCMeta, abstractmethod class BaseOperation: def GetResult(self,a,b): result = 0 return result class Op

创建型模式之 抽象工厂模式

介绍参见菜鸟教程 下面给出C++的一个例子 #include<iostream> #include<memory> using namespace std; //shap接口 class shap { public: virtual void draw() {}; }; //shap接口的实现类 class Rect : public shap { public: void draw() { std::cout << "生成一个矩形" <<

JDK 源码 阅读 - 2 - 设计模式 - 创建型模式

A.创建型模式 抽象工厂(Abstract Factory) javax.xml.parsers.DocumentBuilderFactory DocumentBuilderFactory通过FactoryFinder实例化具体的Factory. 使用例子: DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilder

设计模式——创建型模式

简单的说我们可以把23种设计模式可以归为三大类,分别是创建型模式.结构型模式和行为型模式. 今天,首先看一下创建型模式.创建型设计模式包括5种:单例模式(Singleton).工厂方法模式(Factory Method).抽象工厂模式(Abstract Factory).建造者模式(Builder).原型模式(Prototype).  1.单例模式(Singleton)        1)简介 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的软件设计模式.在它的核心结