C#设计模式随笔 (3)——抽象工厂模式

问题:
多个类型中以系列化的方式创建对象
意图:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
适用性:
• 一个系统要独立于它的产品的创建、组合和表示时。(创建与表示分离)
• 一个系统要由多个产品系列中的一个来配置时。(多系列中选一系列)
• 当你要强调一系列相关的产品对象的设计以便进行联合使用时。(同系列中多种产品)
• 当你提供一个产品类库,而只想显示它们的接口而不是实现时。(客户端依赖抽象)

抽象工厂类的实现

抽象工厂类:
//抽象工厂类:生产手机的工厂
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属性,这样子就不符合”对内关闭,对外开放 “原则了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。