抽象工厂设计模式 解析
创建三层框架
表示层 an 类,业务逻辑层 anBAL 类 ,数据访问层 anDAL 类
定义抽象产品类 和抽象工厂类
anIDAL (类型 接口) Factory(类型 抽象类)
1.定音抽象产品 anIDAL 中的 接口 animal
namespace anIDAL
{ ///抽象产品 接口
public interface anI
{
string animal();
}
}
2. 分别实现 实体产品 anDAL (引用anIDAL)
Brid/anClass.cs 继承抽象产品 anI 实现接口 animal
using anIDAL;
namespace anDAL.Brid
{ /实体产品
public class anClass:anI
{
#region anI 成员
public string animal()
{
string name = "唧唧喳喳";
return name;
}
#endregion
}
}
Cat/anClass.cs 继承抽象产品 anI 实现接口 animal
using anIDAL;
namespace anDAL.Cat
{ /实体产品
public class anClass:anI
{
#region anI 成员
public string animal()
{
string name = "喵喵……喵喵";
return name;
}
#endregion
}
}
Dog/anClass.cs 继承抽象产品 anI 实现接口 animal
using anIDAL;
namespace anDAL.Dog
{ //实体产品
public class anClass:anI
{
#region anI 成员
public string animal()
{
string name = "汪汪……汪汪";
return name;
}
#endregion
}
}
3. 实现抽象工厂 Factory (引用 anDAL(数据访问层) anIDAL(抽象产品类))
anFactory.cs 类
using anIDAL;
using System.Configuration;
namespace Factory
{
public abstract class anFactory
{
/// <summary>
/// /简单工厂设计 实现实体工厂
/// </summary>
/// <returns></returns>
public static anFactory create()
{
//读取配置文件 获取类型
string name = ConfigurationManager.ConnectionStrings["animal"].ConnectionString;
anFactory af = null;
switch(name)
{
case "小狗":
af = new DogClass(); //实现 实体工厂DogClass 类
break;
case "小鸟":
af = new BridClass(); //实现 实体工厂 BridClass 类
break;
case "小猫":
af = new CatClass(); //实现 实体工厂 CatClass 类
break;
}
return af;
}
public abstract anI createFactory(); ///定义抽象工厂 createFactory
}
}
BridClass.cs //实体工厂 小鸟工厂 实现抽象类createFactory
using anDAL.Brid;
namespace Factory
{
public class BridClass:anFactory
{
public override anIDAL.anI createFactory()
{
return new anClass(); //返回实体产品类
}
}
}
CatClass.cs //实体工厂 小猫工厂 实现抽象类createFactory
using anDAL.Cat;
namespace Factory
{
public class CatClass:anFactory
{
public override anIDAL.anI createFactory()
{
return new anClass(); //返回实体产品类
}
}
}
DogClass.cs //实体工厂 小狗工厂 实现抽象类createFactory
using anDAL.Dog;
namespace Factory
{
public class DogClass:anFactory
{
public override anIDAL.anI createFactory()
{
return new anClass(); //返回实体产品类
}
}
}
4. 在业务逻辑层得使用 anBAL(引用 anIDAL(抽象产品类) Factory(抽象工厂类))
类 Class1.cs
using Factory;
using anIDAL;
namespace anBAL
{
public class Class1
{
private static anFactory afd = anFactory.create(); //调用实现抽象工厂 Factory anFactory.cs 类 中的简单工厂设计 实现抽象工厂对象
private static anI aI = null; //定义抽象产品类 的抽象产品对象
public Class1()
{
aI = afd.createFactory(); //使用抽象工厂实现抽象产品对象
}
public string animal()
{
return aI.animal(); //使用抽象产品对象调用实体产品
}
}
}
在数据表示层 显示信息
配置文件信息 将项目打包安装后如果要想实现小猫,小狗或小鸟的方式只需改变配置文件中的
connectionString的值即可用户面对的只是抽象产品
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="animal" connectionString="小狗"/>
</connectionStrings>
</configuration>
只需修改 connectionString 中的小狗/小鸟/小猫