工厂方法模式(Factory Method)
工厂方法模式(Factory Method)的出现解决简单工厂中的难以拓展的问题,解决了其一旦添加新的产品,则需要修改简单工厂方法,进而造成简单工厂的实现逻辑过于复杂。工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,也就克服了简单工厂模式中缺点。工厂方法模式也是属于创建型模式。
using System;
namespace ConsoleApplication
{
//一般每个接口或类都写在单独的.cs文件中
//本示例为了执行查看方便才写在一起
public interface IDatabase
{
void Delete();
void Insert();
}
//Sqlserver的增删
public class Sqlserver : IDatabase
{
public void Delete()
{
Console.WriteLine("delete data from sqlserver");
}
public void Insert()
{
Console.WriteLine("insert data to sqlserver");
}
}
//Mysql的增删
public class Mysql : IDatabase
{
public void Delete()
{
Console.WriteLine("delete data from Mysql");
}
public void Insert()
{
Console.WriteLine("insert data to Mysql");
}
}
public interface ICreator
{
IDatabase CreateDatabase();
}
public class MysqlFactory:ICreator
{
/// <summary>
/// 负责创建Mysql
/// </summary>
/// <returns></returns>
public IDatabase CreateDatabase()
{
return new Mysql();
}
}
public class SqlserverFactory:ICreator
{
/// <summary>
/// 负责创建Sqlserver
/// </summary>
/// <returns></returns>
public IDatabase CreateDatabase()
{
return new Sqlserver();
}
}
/*public static class IFactory
{
//根据需求创建
public static Database CreateDatabase(string dbType)
{
Database db = null;
switch (dbType)
{
case "Sqlserver":
db = new Sqlserver();
break;
case "Mysql":
db = new Mysql();
break;
default:
break;
}
return db;
}
}*/
class Program
{
static void Main(string[] args)
{
IDatabase db1 = new SqlserverFactory().CreateDatabase();
db1.Delete();
db1.Insert();
IDatabase db2 = new MysqlFactory().CreateDatabase();
db2.Delete();
db2.Insert();
//添加新数据库直接添加对应的类即可
Console.ReadKey();
}
}
}