设计模式(创建型——简单工厂、工厂方法、抽象工厂模式)

三、抽象工厂模式

3.1 简单工厂模式(静态工厂方法)

3.1.1 简单工厂模式的概念

  • 使用场景
    • 创建同类对象,例如动物中的猫、狗
  • 变化点
    • 同类型的具体对象的数量会随着需求的变动而不断增加
      • 例如,由原来的猫、狗,增加为猫、狗、兔、猴等等
      • 对应代码来说,就是创建对象的代码会不断的改动

3.1.2 简单工厂模式的实现

  • 将同类对象的创建过程隔离封装起来
  • 使用静态类
    • 只是提供创建对象的方法,不需要被实例化
    • 静态类中不允许非静态成员,所以创建对象的方法也应该是静态的

在这里插入图片描述

public abstract class Animal
{
    public abstract void Eat();
    public abstract void Sleep();
}

public class Cat : Animal
{
    public override void Eat()
    {
        Console.WriteLine("猫吃鱼!");
    }
    public override void Sleep()
    {
        Console.WriteLine("猫睡觉!");
    }
}


public class Dog : Animal
{
    public override void Eat()
    {
        Console.WriteLine("狗吃肉!");
    }
    public override void Sleep()
    {
        Console.WriteLine("狗睡觉!");
    }
}


public static class AnimalFactory
{
    public static Animal CreateAnimal(string animalType)
    {
        Animal animal = null;
        switch (animalType)
        {
            case "猫":
                animal = new Cat();
                break;
            case "狗":
                animal = new Dog();
                break;
        }
        return animal;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Animal animal = AnimalFactory.CreateAnimal("猫");
        animal.Eat();
        animal.Sleep();
        Console.ReadLine();
    }
}

3.2 工厂方法模式

3.2.1 工厂方法模式的概念

  • 使用场景
    • 与简单的静态工厂模式类似,都是为了创建同类对象,例如动物中的猫、狗
  • 不同点
    • 静态工厂模式中的静态方法会随着需求的变化而对代码进行改动
      • 不符合设计模式的原则,即对修改关闭,对拓展开放
      • 优点是实现简单
    • 工厂方法则是静态工厂模式为符合设计模式原则而进行的改进形式

3.2.2 工厂方法模式的实现

在这里插入图片描述

public abstract class Animal
{
    public abstract void Eat();
    public abstract void Sleep();
}

public class Cat : Animal
{
    public override void Eat()
    {
        Console.WriteLine("猫吃鱼!");
    }
    public override void Sleep()
    {
        Console.WriteLine("猫睡觉!");
    }
}


public class Dog : Animal
{
    public override void Eat()
    {
        Console.WriteLine("狗吃肉!");
    }
    public override void Sleep()
    {
        Console.WriteLine("狗睡觉!");
    }
}

public abstract class AnimalFactory
{
    public abstract Animal CreateAnimal();
}
public class CatFactory : AnimalFactory
{
    public override Animal CreateAnimal()
    {
        return new Cat();
    }
}
public class DogFactory : AnimalFactory
{
    public override Animal CreateAnimal()
    {
    	return new Dog();
    }
}
class Program
{
    static void Main(string[] args)
    {
    	AnimalFactory animalFactory = new CatFactory();
        Animal animal = animalFactory.CreateAnimal();
        animal.Eat();
        animal.Sleep();
        Console.ReadLine();
    }
}

3.3 抽象工厂模式

3.3.1 抽象工厂模式的概念

  • 使用条件
    • 条件一:涉及多系列对象的构建
      • 一个系列包含多类对象
      • 如果一个系列只包含一类对象,则应该使用简单的静态工厂模式
    • 条件二:同一系列不同对象之间相互依赖
      • 例如,涉及数据库操作的一系列对象
        • sqlserver相关的连接、操作、参数对象
        • mysql相关的连接、操作、参数对象等
        • 同一系列对象之间相互依赖
  • 应用场景
    • 应对“新系列”的需求变动
    • 例如,涉及数据库操作的系列对象,sqlserver、mysql,之后不断增加对oracle、sqlite等数据库操作的支持

3.3.2 抽象工厂模式的实现

  • 将整个系列对象的创建封装起来
    • 例如,封装为一个类,这个类负责整个系列对象的创建

在这里插入图片描述

public abstract class DBConnection
{
    public abstract void Open();
    public abstract void Close();
}

public abstract class DbParameter
{
    public abstract string ParameterName { get; set; }
    public abstract object Value { get; set; }
}

public class SqlConnection : DBConnection
{
    public override void Open()
    {
        Console.WriteLine("Sql连接打开!");
    }
    public override void Close()
    {
        Console.WriteLine("Sql连接关闭!");
    }
}

public class MySqlConnection : DBConnection
{
    public override void Open()
    {
        Console.WriteLine("MySql连接打开!");
    }
    public override void Close()
    {
        Console.WriteLine("MySql连接关闭!");
    }
}

public class SqlParameter : DbParameter
{
    public override string ParameterName { get; set; }
    public override Object Value { get; set; }
}

public class MySqlParameter : DbParameter
{
    public override string ParameterName { get; set; }
    public override Object Value { get; set; }
}


public abstract class DBFactory
{
    public abstract DBConnection CreateDBConnection();
    public abstract DbParameter CreateDBParameter();
}

public class SqlFactory : DBFactory
{
    public override DBConnection CreateDBConnection()
    {
        return new SqlConnection();
    }

    public override DbParameter CreateDBParameter()
    {
        return new SqlParameter();
    }
}

public class MySqlFactory : DBFactory
{
    public override DBConnection CreateDBConnection()
    {
        return new MySqlConnection();
    }

    public override DbParameter CreateDBParameter()
    {
        return new MySqlParameter();
    }
}

class Program
{
    static void Main(string[] args)
    {
        DBFactory dBFactory = new SqlFactory();
        
        //可以继续封装成一个工具类,对数据库进行增删改查操作
        DBConnection connection = dBFactory.CreateDBConnection();
        DbParameter parameter = dBFactory.CreateDBParameter();
        connection.Open();
        parameter.Value = "18";
        parameter.ParameterName = "age";
        Console.WriteLine($"{parameter.ParameterName}:{parameter.Value}");
        connection.Close();

        Console.ReadLine();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值