工厂设计模式

本文详细介绍了工厂设计模式中的简单工厂、工厂方法和抽象工厂,通过实例展示了如何在数据库操作类场景中降低耦合性,以及如何根据产品系列扩展到多产品情况。
摘要由CSDN通过智能技术生成

工厂系列设计模式

​ 工厂系列设计模式包含由简单工厂、工厂方法和抽象工厂三种。开头我们先简单说一下这三种设计模式的区别:

  • 简单工厂:对于某一个产品,通常存在一个具体工厂用于生成产品类
  • 工厂方法:对于某一个产品,通常定义一个工厂接口,通过不同的具体工厂实现该接口,然后不同的具体工厂生成不同的具体产品
  • 抽象工厂:对于一系列产品,通常定义一个工厂接口,包含所有产品的构建方法,然后定义不同系列的具体工厂实现该接口,每个系列具体工厂生成可以生成该系列的所有产品

简单工厂

​ 场景1:现在有一个User表的操作类接口IUser,数据库使用MySQL和Oracle,要求创建对应数据库的操作类。

​ 如果利用简单工厂模式,伪代码以及UML类图如下:

UML
UML
// 定义产品通用接口
interface IUser{
    public void insert();
    public User select(int id)// UML类图忘记写入参了 这里就不改了
}
// 定义不同数据库的实现
class MySQLIUser{
    public void insert()
     // 对应MySQL的操作
    }
    public User select(int id)
     // 对应MySQL的操作
    }
}
class OracleIUser{
    public void insert()
     // 对应Oracle的操作
    }
    public User select(int id)
     // 对应Oracle的操作
    }
}
// 定义工厂类
class IUserFactory{
    public IUser createIUser(String dataBase){
        switch (dataBase){
                case "MySQL" ...
                case "Oracle" ...
        }
        ...
    }
}

在客户端调用时,如下:

class Client(){
    psvm(String[] args){
        String dataBase = "MysQL";
        IUserFactory mysqlIF = new IUserFactory(dataBase);
        mysqlIF.insert();
        String dataBase = "Oracle";
        IUserFactory oracleIF = new IUserFactory(dataBase);
        oracleIF.select();
    }
}

工厂方法

​ 场景1:现在有一个User表的操作类接口IUser,数据库使用MySQL和Oracle,要求创建对应数据库的操作类

还是同样的场景,上述简单工厂存在的问题:如果增加数据库类型,那么需要改动工厂类以及客户端代码,耦合性较高,如果使用工厂方法解决该场景,UML类图和伪代码如下:

UML类图
UML类图
// 定义产品通用接口
...
// 定义不同数据库的实现
...
// 定义工厂接口
interface IUserFactory{
    public IUser createIUser();
}
// 定义具体工厂
public IUser MySQLIUserFactory implement IUserFactory{
    public IUser createIUser(){
        return new MysQLIUser();
    }
}
public IUser OracleIUserFactory implement IUserFactory{
    public IUser createIUser(){
        return new OracleIUser();
    }
}

客户端调用时,如下:

class Client{
    psvm(String[] args){
        //MySQL
        IUserFactory MySQLIF = new MySQLIUserFactory();
        MySQLIF.select();
        //Oracle
        IUserFactory OracleIF = new OracleIUserFactory();
        OracleIF.select();
    }
}

抽象工厂

场景2:现在有个User表和Department表的操作类接口IUser和IDepartment,数据库使用MySQL和Oracle,要求创建对应数据库的操作类

​ 这个场景下如果还使用工厂方法,那么需要在定义一个IDepartmentFactory工厂接口以及不同数据库的实现,如果表的数量不多,那么可以结束,如果很多的话,那么接口的数量就太多了。此时在遇到这种一系列的产品创建时,我们可以使用抽象工厂解决。伪代码和UML类图如下:

抽象工厂UML
抽象工厂UML
// 定义产品A的接口
public interface IUer{
    publi void insert();
    public User select(User user);
}
// A的实现
class MySQLIUser implement IUser{
    ...
}
class OracleIUser implement IUser{
    ...
}
// 定义产品B的接口
...
// 定义工厂接口
public interface IFactory{
    public IUser createIUser();
    public IDepartment createIDepartment();
}
// 工厂接口实现
class MySQLFactory implement IFactory{
    public IUser createIUser(){
        return new MySQLIUser();
    }
    public IDepartment createIDepartment(){
        return new MySQLIDepartment();
    }
}
class OracleFactory implement IFactory{
    ...
}

访客端代码:

class Client{
    psvm(String[] args){
        MySQLFactory mf = new MySQLFactory();
        MySQLIUser miu = mf.createMySQLIUser();
        miu.insert();
        OracleFactory of = new OracleFactory();
        OracleIDepartment oid = of.OracleIDepartment();
        Department department = oid.select(id);
    }
}
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值