如果你也喜欢C#开发或者.NET开发,可以关注我,我会一直更新相关内容,并且会是超级详细的教程,只要你有耐心,基本上不会有什么问题,如果有不懂的,也可以私信我加我联系方式,我将毫无保留的将我的经验和技术分享给你,不为其他,只为有更多的人进度代码的世界,而进入代码的世界,最快捷和最容易的就是C#.NET,准备好了,就随我加入代码的世界吧!
案例代码已上传:
一、抽象工厂模式简介:
抽象工厂模式是一种创建型设计模式,它提供了一种封装一组相关对象创建的方式。在抽象工厂模式中,客户端不直接实例化具体的产品,而是通过抽象工厂来创建产品的实例。抽象工厂定义了一组用于创建产品的抽象方法,具体的工厂则实现了这些抽象方法来创建具体的产品。
抽象工厂模式适用于需要创建一组相关对象的情况,这些对象之间存在一定的约束关系。通过使用抽象工厂模式,可以降低客户端与具体产品之间的耦合度,提高系统的可扩展性和灵活性。
抽象工厂模式由以下几个角色组成:
- 抽象工厂(AbstractFactory):定义了一组创建产品的抽象方法。
- 具体工厂(ConcreteFactory):实现了抽象工厂定义的抽象方法,用于创建具体产品的实例。
- 抽象产品(AbstractProduct):定义了产品的抽象方法。
- 具体产品(ConcreteProduct):实现了抽象产品定义的抽象方法,具体的产品。
使用抽象工厂模式时,首先需要定义一组相关的产品抽象方法,然后实现这些抽象方法的具体产品类。接下来定义一个抽象工厂接口,其中声明了一组用于创建产品的抽象方法。最后,编写具体的工厂类,实现抽象工厂接口,并根据需要创建具体的产品对象。
二、为什么要学习抽象工厂模式:
2.1 提供了一种良好的代码设计方式:
抽象工厂模式能够帮助开发者将代码按照一定的组织结构进行划分,提高代码的可读性和可维护性。
2.2 实现了高内聚低耦合:
抽象工厂模式能够将相关的类组织在一起,减少类之间的直接依赖关系,使得系统的组件之间更加独立。
2.3 提供了一种扩展的方式:
抽象工厂模式通过定义一组接口,可以更方便地扩展新的子类工厂,而不需要修改现有代码。
2.4 支持产品簇的创建:
抽象工厂模式可以一次性创建一系列相关的产品对象,而不需要单独创建每个产品对象。
2.5 便于切换产品簇:
抽象工厂模式可以通过修改具体工厂的实现,实现对整个产品簇的切换,使得系统更加灵活和可扩展。
三、抽象工厂模式在项目中有哪些实际应用:
3.1 GUI框架:
抽象工厂模式可以用于创建不同操作系统的用户界面组件,比如按钮、文本框等。根据当前操作系统的类型,使用不同的具体工厂来创建相应的组件。
3.2 数据库访问:
在一个支持多种数据库的系统中,可以使用抽象工厂模式来创建不同数据库的连接对象和操作对象。根据用户配置或者系统环境,选择不同的具体工厂来创建相应的对象。
3.3 游戏开发:
在游戏开发中,抽象工厂模式可以用于创建不同类型的角色、武器、道具等。不同的关卡或者游戏模式可以使用不同的具体工厂来创建相应的对象。
3.4 日志记录:
在一个支持多种日志记录方式的系统中,可以使用抽象工厂模式来创建不同类型的日志记录器。根据系统配置或者运行环境,选择不同的具体工厂来创建相应的日志记录器。
3.5 网络通信:
在一个支持多种网络通信协议的系统中,可以使用抽象工厂模式来创建不同类型的通信对象。根据系统需求或者用户设置,选择不同的具体工厂来创建相应的通信对象。
四、抽象工厂模式的实践:
背景:灵山这个大集团有两个派系,每个派系都有佛祖和菩萨,分别是如来一派和燃灯一派,如来一派的代表人员有佛祖:如来佛祖,菩萨:文殊菩萨,而燃灯一派的代表人员有佛祖:燃灯古佛,菩萨:观音菩萨,现在需要选择一派来管理灵山,请你用抽象工厂模式设计这个系统;
4.1 定义抽象产品:佛祖和菩萨
4.1.1 抽象产品菩萨接口,输出菩萨
/// <summary>
/// 抽象产品菩萨
/// </summary>
public interface Bodhisattva
{
/// <summary>
/// 输出菩萨
/// </summary>
void ExportBodhisattva();
}
4.1.2 抽象产品佛祖接口,输出佛祖
/// <summary>
/// 抽象产品佛祖
/// </summary>
public interface Sakyamuni
{
/// <summary>
/// 输出佛祖
/// </summary>
void ExportSakyamuni();
}
4.2 定义具体产品:生成派系代表
4.2.1 实现抽象产品佛祖接口
/// <summary>
/// 具体产品燃灯古佛
/// </summary>
public class BurningLampAncientBuddha : Sakyamuni
{
/// <summary>
/// 实现抽象产品中的输出佛祖方法
/// </summary>
public void ExportSakyamuni()
{
Console.WriteLine("燃灯古佛");
}
}
/// <summary>
/// 具体产品如来佛祖
/// </summary>
public class TathagataBuddha : Sakyamuni
{
/// <summary>
/// 实现抽象产品中的输出佛祖方法
/// </summary>
public void ExportSakyamuni()
{
Console.WriteLine("如来佛祖");
}
}
4.2.2 实现抽象产品菩萨接口
/// <summary>
/// 具体产品观音菩萨
/// </summary>
public class Guanyin : Bodhisattva
{
/// <summary>
/// 实现抽象产品中的输出菩萨方法
/// </summary>
public void ExportBodhisattva()
{
Console.WriteLine("观音菩萨");
}
}
/// <summary>
/// 具体产品文殊菩萨
/// </summary>
public class Wenshu : Bodhisattva
{
/// <summary>
/// 实现抽象产品中的输出菩萨方法
/// </summary>
public void ExportBodhisattva()
{
Console.WriteLine("文殊菩萨");
}
}
4.3 定义抽象工厂:灵山工厂
/// <summary>
/// 灵山工厂接口
/// </summary>
public interface LingShanFactory
{
/// <summary>
/// 创建菩萨
/// </summary>
/// <returns></returns>
Bodhisattva CreateBodhisattva();
/// <summary>
/// 创建佛祖
/// </summary>
/// <returns></returns>
Sakyamuni CreateSakyamuni();
}
4.4 定义具体工厂:生产派系
/// <summary>
/// 具体工厂创建古佛派系
/// </summary>
public class GufoFactionFactory : LingShanFactory
{
/// <summary>
/// 具体工厂古佛派系的菩萨代表:观音
/// </summary>
/// <returns></returns>
public Bodhisattva CreateBodhisattva()
{
return new Guanyin();
}
/// <summary>
/// 具体工厂古佛派系的佛祖代表:燃灯古佛
/// </summary>
/// <returns></returns>
public Sakyamuni CreateSakyamuni()
{
return new BurningLampAncientBuddha();
}
}
/// <summary>
/// 具体工厂创建如来派系
/// </summary>
public class RulaiFactionFactory : LingShanFactory
{
/// <summary>
/// 具体工厂如来派系的菩萨代表:文殊
/// </summary>
/// <returns></returns>
public Bodhisattva CreateBodhisattva()
{
return new Wenshu();
}
/// <summary>
/// 具体工厂如来派系的佛祖代表:如来佛祖
/// </summary>
/// <returns></returns>
public Sakyamuni CreateSakyamuni()
{
return new TathagataBuddha();
}
}
4.3 工厂调用:
现在想要如来一派上位,输出该派系的佛祖和菩萨代表:
public class Program
{
static void Main(string[] args)
{
//灵山现在需要一个派系来掌权
LingShanFactory factory;
Sakyamuni sakyamuni;
Bodhisattva bodhisattva;
//选择派系
factory =new RulaiFactionFactory();
//创建派系的代表佛祖和菩萨
sakyamuni= factory.CreateSakyamuni();
bodhisattva= factory.CreateBodhisattva();
//输出派系的代表佛祖和菩萨
sakyamuni.ExportSakyamuni();//代表佛祖
bodhisattva.ExportBodhisattva();//代表菩萨
}
}
看下运行结果:
现在改变主意了,想要古佛派系上位,输出古佛派系的代表佛祖和菩萨:
public class Program
{
static void Main(string[] args)
{
//灵山现在需要一个派系来掌权
LingShanFactory factory;
Sakyamuni sakyamuni;
Bodhisattva bodhisattva;
//选择派系
factory =new GufoFactionFactory();
//创建派系的代表佛祖和菩萨
sakyamuni= factory.CreateSakyamuni();
bodhisattva= factory.CreateBodhisattva();
//输出派系的代表佛祖和菩萨
sakyamuni.ExportSakyamuni();//代表佛祖
bodhisattva.ExportBodhisattva();//代表菩萨
}
}
查看运行结果:
五、抽象工厂模式的优缺点:
5.1 抽象工厂模式的优点:
5.1.1 提供了一种高级别的接口,隐藏了具体类的创建细节,使客户端代码与具体类的实现相分离。
5.1.2 在一个系统中使用抽象工厂模式可以保证一系列相关对象的一致性,使得它们能够协同工作。
5.1.3 可以实现类的替换和灵活性,只需更改具体工厂类即可改变整个系统的产品族。
5.2 抽象工厂模式的缺点:
5.2.1 增加了系统的复杂度,因为引入了多个工厂接口和多个具体工厂类,需要同时维护它们之间的关系。
5.2.2 新增加的具体产品需要修改抽象工厂和所有具体工厂类的代码,违反了开闭原则。
5.2.3 由于抽象工厂模式需要创建多个对象,可能会导致系统的性能下降。
六、使用抽象工厂模式需要注意的地方:
6.1 明确需求:
在使用抽象工厂模式之前,需要明确对于对象家族的需求以及其具体实现类的构成。
6.2 扩展性:
抽象工厂模式的一个主要优势是其扩展性。当我们需要增加新的产品家族时,只需要新增一个具体工厂类即可。因此,在设计时要考虑到系统的扩展性。
6.3 一致性:
抽象工厂模式可以确保创建的产品具有一致性。通过使用同一个具体工厂类,可以确保创建的产品属于同一家族,相互之间是兼容的。
6.4 可替换性:
抽象工厂模式使得客户端与具体产品的实现解耦,客户端只需要通过抽象接口来使用产品,而不需要关心具体产品的实现细节。这样,可以方便地替换具体工厂类或者具体产品类,而不影响客户端的代码。
6.5 遵循开闭原则:
抽象工厂模式可以帮助我们遵循开闭原则,因为通过增加新的具体工厂类和产品类,我们可以扩展系统的功能而不需要修改已有的代码。
需要注意的是,抽象工厂模式适用于对象家族的创建,如果只需要创建单个对象,可以考虑使用工厂方法模式。另外,抽象工厂模式的实现可能较为复杂,适用于较大规模的系统。在小规模系统中,可能会增加不必要的复杂性。
标签:派系,具体,创建,模式,工厂,抽象,易懂,设计模式,public From: https://blog.csdn.net/Malex2024/article/details/139897943