封装创建过程:工厂模式将对象的创建过程封装在一个单独的类(即工厂类)中,客户端无需知道如何创建具体的产品对象,只需调用工厂类的方法即可获取所需产品。
分离接口和实现:通过工厂模式,可以将产品的抽象接口与其实现细节分离开来。客户端代码仅依赖于抽象产品接口,而不直接依赖于具体的产品实现,这样有助于降低耦合度。
易于扩展和修改:当需要添加新的产品类型时,只需要增加一个新的产品类并修改工厂类的逻辑,而不需要修改使用这些产品的客户端代码。这遵循了“开闭原则”——对扩展开放,对修改关闭。
支持多种产品族:如果系统中有多系列产品需要根据条件动态生成不同的实例,工厂模式可以很好地处理这种情况,使得不同系列的产品能够共用一个创建逻辑。
便于单元测试:在测试环境中,可以通过替换工厂类为模拟版本(Mock Object),轻松地创建测试数据,进而对依赖对象的行为进行控制和验证。
控制复杂对象的创建:对于构造参数多、构造过程复杂的对象,工厂方法可以把这部分逻辑集中起来管理,避免在各处重复编写相同的创建逻辑。
总之,工厂模式提高了软件系统的灵活性、可扩展性和可维护性,在设计阶段就能更好地预见和应对未来的需求变化。
假设我们有三个装备类型(武器、护甲)和三种职业角色(战士、法师、盗贼),下面是完整的C#代码:
using System.Collections.Generic;
public enum ProfessionType
{
Warrior,
Mage,
Rogue
}
// 抽象角色类
public abstract class Character
{
public string Name { get; set; }
public ProfessionType Profession { get; protected set; }
public List<Equipment> Equipment { get; set; }
// 其他通用属性和方法...
}
// 抽象装备基类
public abstract class Equipment
{
public string Name { get; set; }
}
// 武器类
public class Weapon : Equipment
{
public int AttackPower { get; set; }
}
// 盔甲类
public class Armor : Equipment
{
public int DefenseRating { get; set; }
}
// 角色工厂类
public static class CharacterFactory
{
public static Character CreateCharacter(ProfessionType profession)
{
switch (profession)
{
case ProfessionType.Warrior:
return new Warrior();
case ProfessionType.Mage:
return new Mage();
case ProfessionType.Rogue:
return new Rogue();
default:
throw new ArgumentException("Invalid profession type");
}
}
public static List<Equipment> CreateInitialEquipment(ProfessionType profession)
{
switch (profession)
{
case ProfessionType.Warrior:
return new List<Equipment>
{
new Weapon() { Name = "新手剑", AttackPower = 30 },
new Armor() { Name = "铁甲", DefenseRating = 50 }
};
case ProfessionType.Mage:
return new List<Equipment>
{
new Weapon() { Name = "魔法杖", AttackPower = 20, MagicPower = 40 },
new Armor() { Name = "学者袍", DefenseRating = 30, MagicDefense = 60 }
};
case ProfessionType.Rogue:
return new List<Equipment>
{
new Weapon() { Name = "短剑", AttackPower = 25, CritChance = 15 },
new Armor() { Name = "皮甲", DefenseRating = 40, AgilityBonus = 10 }
};
default:
throw new ArgumentException("Invalid profession type for equipment creation");
}
}
}
// 战士角色类
public class Warrior : Character
{
public Warrior()
{
this.Profession = ProfessionType.Warrior;
this.Equipment = CharacterFactory.CreateInitialEquipment(this.Profession);
}
// ...
}
// 法师角色类
public class Mage : Character
{
public Mage()
{
this.Profession = ProfessionType.Mage;
this.Equipment = CharacterFactory.CreateInitialEquipment(this.Profession);
}
// ...
}
// 盗贼角色类
public class Rogue : Character
{
public Rogue()
{
this.Profession = ProfessionType.Rogue;
this.Equipment = CharacterFactory.CreateInitialEquipment(this.Profession);
}
// ...
}
现在你可以在项目中通过 CharacterFactory
来创建不同职业的角色,并为他们分配初始装备。当需要添加新职业或调整装备配置时,只需修改工厂类的相关逻辑即可。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(41-50)
————————————————
?最后我们放松一下眼睛