抽象工厂模式学习总结

目录

 

抽象工厂模式

引言

定义

抽象工厂模式类图

实例

实例描述

实例类图

代码实现

抽象工厂模式扩展

1.开闭原则的倾斜性

2.工厂模式,简单工厂模式和抽象工厂模式的关系

总结

模式优点

模式缺点


抽象工厂模式

引言

工厂模式是抽象工厂模式特例,在工厂模式中,一个工厂对应一个产品,在抽象工厂模式中,一个工厂对应N个产品,当N=1时,抽象工厂模式就退化成了工厂模式。

                                        抽象工厂模式重要等级★★★★★          抽象工厂模式难度等级★★★★☆

定义

英文定义:"Provide an interface for creating families of related or dependent objects without specifying their concrete classes."。

中文定义:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。

 

抽象工厂模式类图

抽象工厂模式学习总结_第1张图片

抽象工厂中的角色和工厂模式中一样,不同的是,抽象工厂中定义多个工厂方法。

实例

原有手机工厂生产手机,现在老板决定让工厂不单单生产手机了,还要生产电脑。

实例描述

改造工厂模式中的手机工厂,让不同品牌的工厂不单单能生产手机,还能生产其他电子产品,如电脑。本实例依赖于工厂模式中的实例代码。

实例类图

抽象工厂模式学习总结_第2张图片

代码实现

Computer(抽象电脑类)

interface Computer
{
    void Open();
}

2 改造原有的手机工厂,在手机工厂接口中声明生产电脑的方法,编译器会自动提示具体工厂实现该方法。

interface PhoneFactory
{
    Phone CreatePhone();

    //原先的手机工厂改造成能生产电脑
    Computer CreateComputer();
}

MACHUAWEIComputer具体产品(电脑)类

class HUAWEIComputer : Computer
{
    public void Open()
    {
        Console.WriteLine("华为电脑开机。");
    }
}

class Mac : Computer
{
    public void Open()
    {
        Console.WriteLine("苹果电脑开机。");
    }
}

4 具体工厂实现新的接口方法。

class IphoneFactory : PhoneFactory
{
    public Computer CreateComputer()
    {
        return new Mac();
    }

    public Phone CreatePhone()
    {
        return new IphoneX();
    }
}

class HUAWEIFactory : PhoneFactory
{
    public Computer CreateComputer()
    {
        return new HUAWEIComputer();
    }

    public Phone CreatePhone()
    {
        return new HUAWEI();
    }
}

 

5 编写测试类

class Program
{
    static void Main(string[] args)
    {
        PhoneFactory factory;
        Phone phone;
        Computer computer;

        //使用苹果工厂生产苹果产品
        factory = new IphoneFactory();
        phone = factory.CreatePhone();
        computer = factory.CreateComputer();
        phone.Play();
        computer.Open();
        //使用华为工厂生产华为产品
        factory = new HUAWEIFactory();
        phone = factory.CreatePhone();
        computer = factory.CreateComputer();
        phone.Play();
        computer.Open();

        Console.ReadKey();
    }
}

6 运行结果

抽象工厂模式学习总结_第3张图片

抽象工厂模式扩展

1.开闭原则的倾斜性

将实例中的不同品牌称为产品族,将实例中不同电子产品称作为产品等级结构。通过实例的编码,我们可以感觉受到抽象工厂模式在对这俩个纬度进行扩展的时候,开闭原则的支持情况是不同的。

(1)增加产品族:对于增加一个新的产品族,抽象工厂模式只需要对应增加一个新的工厂即可,对已有的代码无需做任何修改,完全满足“开闭原则”。比如实例中再新增一个小米工厂,那么就可以生产小米手机,电脑。而不需要修改已有代码。

(2)增加产品等级结构:对于增加新的产品等级结构,需要修改抽象工厂接口,在其中新增产品等级结构的工厂方法,如此一来所有的具体工厂角色都需要修改实现新的方法,不支持”开闭原则“。

我们将抽象工厂的这种产品族纬度满足开闭原则,产品等级结构不满足开闭原则的情况称为开闭原则的倾斜性。在实际系统设计时,应该合理的选择将不扩展的维度定义为产品等级结构,将易扩展的纬度定义为产品族。

2.工厂模式,简单工厂模式和抽象工厂模式的关系

观察简单工厂模式、工厂模式、抽象工厂模式的类图可以发现,当抽象工厂模式中的产品等级结构只有一个,即工厂方法只有一个的时候,此时抽象工厂模式就退化成了工厂模式;当工厂模式中所有的产品都交给一个统一的具体工厂创建时,抽象工厂类省略,并且将工厂方法定义为静态方法,此时工厂模式就退化成了简单工厂模式。实际开发中,应该根据实际业务场景,合理的选择工厂模式。

总结

模式优点

1.开闭模式的倾斜性,让抽象工厂模式容易扩展产品族,新增一个产品族无需修改任何已有代码,满足开闭原则。

2.抽象工厂模式将类的使用和创建解耦。

3.当一个产品族中多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

模式缺点

对于产品等级结构的扩展难度较大。

你可能感兴趣的:(设计模式)