问题:
多个类型中以系列化的方式创建对象
意图:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
适用性:
• 一个系统要独立于它的产品的创建、组合和表示时。(创建与表示分离)
• 一个系统要由多个产品系列中的一个来配置时。(多系列中选一系列)
• 当你要强调一系列相关的产品对象的设计以便进行联合使用时。(同系列中多种产品)
• 当你提供一个产品类库,而只想显示它们的接口而不是实现时。(客户端依赖抽象)
抽象工厂类的实现
抽象工厂类:
//抽象工厂类:生产手机的工厂
public abstract class abstractfactory
{
public abstract 中芯xingpian Use中芯xingpian();
public abstract 高通xingpian Use高通xingpian();
}
具体工厂类:华为和xx手机的具体工厂
public class Huawei : abstractfactory
{
public override 中芯xingpian Use中芯xingpian()
{
return new 中芯xingpian_Huawei();
}
public override 高通xingpian Use高通xingpian()
{
return new 高通xingpian_Huawei();
}
}
public class XX手机 : abstractfactory
{
public override 中芯xingpian Use中芯xingpian()
{
return new 中芯xingpian_XX手机();
}
public override 高通xingpian Use高通xingpian()
{
return new 高通xingpian_XX手机();
}
}
抽象产品类:手机芯片的抽象类(不知道华为手机装上面芯片)
//抽象产品类
public abstract class 中芯xingpian
{
public abstract void Info();
}
public abstract class 高通xingpian
{
public abstract void Info();
}
具体产品类:生成装什么芯片的手机
public class 高通xingpian_Huawei: 高通xingpian
{
public override void Info()
{
Console.WriteLine("装高通芯片的华为手机");
}
}
public class 中芯xingpian_Huawei : 中芯xingpian
{
public override void Info()
{
Console.WriteLine("装中芯芯片的华为手机");
}
}
public class 高通xingpian_XX手机 : 高通xingpian
{
public override void Info()
{
Console.WriteLine("装高通芯片的XX手机");
}
}
public class 中芯xingpian_XX手机 : 中芯xingpian
{
public override void Info()
{
Console.WriteLine("装中芯芯片的XX手机");
}
}
客户端调用
//客户端
//创建工厂类
abstractfactory huaweifactory = new Huawei();
中芯xingpian zx_01 = huaweifactory.Use中芯xingpian();
zx_01.Info();
高通xingpian gx_01 = huaweifactory.Use高通xingpian();
gx_01.Info();
abstractfactory XXabstractfactory = new XX手机();
中芯xingpian zx_02 = XXabstractfactory.Use中芯xingpian();
高通xingpian gx_02 = XXabstractfactory.Use高通xingpian();
zx_02.Info();
gx_02.Info();
Console.ReadKey();
PS:从上面的例子可以看出华为的工厂只能生产华为品牌的手机,具体是生产装什么芯片的手机这个是可以定的,同理xx工厂只能生成XX手机。产品依赖于抽象工厂对象,假如要生产小米手机,就要建小米的工厂,建装华为芯片版本的小米手机生产线,和建装高通芯片版本的小米手机生产线
抽象工厂模式组成
(1)、抽象产品类角色(AbstractProduct):为抽象工厂中相互依赖的每种产品定义抽象接口对象,也可以这样说,有几种
产品,就要声明几个抽象角色,每一个抽象产品角色和一种具体的产品相匹配。
(2)、具体产品类(ConcreteProduct):具体产品类实现了抽象产品类,是针对某个具体产品的实现的类型。
(3)、抽象工厂类角色(Abstract Factory):定义了创建一组相互依赖的产品对象的接口操作,每种操作和每种产品一一对应。
(4)、具体工厂类角色(ConcreteFactory):实现抽象类里面的所有抽象接口操作,可以创建某系列具体的产品,这些具体的产品是“抽象产品类角色”的子类。
下面根据游戏的套装的来进行深入的讲解
游戏更新出来三个套装,每个套装都有攻击,防御,技能,血量的属性的,那他们的关系是怎么样的呢??
首先游戏有个套装生产工厂(抽象工厂类),生产出来的的名字 寒霜,烈焰 勇士 等三个套装(具体工厂类)
每个套装生产出来都有攻击,防御,技能,血量(抽象产品类),但是他们的属性有各不相同,所以给他们的攻击,防御,技能,血量都是各不相相同的,其中,寒霜(冰冻),烈焰(灼烧),勇士(加血),这些技能都是(具体产品类),他们的实现逻辑都是不一样的。综上所说,你要获得一个寒霜套装,你要通过寒霜套装工厂生产,其他工厂是生产不出来,生产出来的寒霜套装,是拥有冰冻效果的。如果你想要获得灼烧效果,你只能通过烈焰套装工厂获得烈焰套装获得。
他们是一系列的关系,是解决一个产品族的问题,因为你游戏不可能只有一件的套装。
优缺点:你可以对具体工厂类进行扩展很容易的,符合设计原则(对内关闭,对外开放原则),但是你要对产品列进行扩展,那抽象工厂对于添加新产品这种情况就不支持”对内关闭,对外开放 “原则了。
PS;
套装生产工厂多搞了个 战神套装工厂,你的的战神套装很快被生产出来了,但是你要在产品类中添加新的BUFF属性(新产品)
那么之前的套装也要加上这个buff属性,这样子就不符合”对内关闭,对外开放 “原则了。