三、抽象工厂模式
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();
}
}