入门设计模式之抽象工厂模式(二)

偶尔善良 提交于 2020-01-15 18:14:34

一、描述

        当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。好比不同品牌下有各式各样的商品。

二、优劣势


优点:用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件  体系结构的优化。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象里加代码,又要在具体的里面加代码。

三、需求

      生产鼠标,有2个品牌,惠普和戴尔,每个品牌都能成产鼠标和键盘。


四、使用其他设计模式

简单工厂:https://blog.csdn.net/dicunsi2939/article/details/103922023

工厂模式:https://blog.csdn.net/dicunsi2939/article/details/103923644

如果我们这边也使用工厂模式,那么就会出现惠普鼠标工厂、惠普键盘工厂,那么从名字来看就有点耦合了,都是惠普工厂,干嘛还分鼠标和键盘,所以我们引用抽象工厂。

五、使用设计模式

        通过添加工厂类,生成产品的工作交给它来负责。   

        3个类,

        MouseBase.cs  -鼠标基类  

        HpMouse.cs -惠普鼠标类

        DellMouse.cs -戴尔鼠标类

        KeyBoardBase.cs  键盘基类  

        Hp KeyBoard.cs -惠普键盘类

        Dell KeyBoard.cs -戴尔键盘类

        FactoryBase.cs -抽象工厂基类

        HpFactory.cs -惠普工厂
        DellFactory.cs -戴尔工厂

//鼠标基类
public abstract class MouseBase
{  
    public abstract void Show();
}

//惠普鼠标
public class HpMouse : MouseBase
{
    public override void Show()
    {
        Debug.Log("惠普鼠标老品牌值得信赖!");
    }
}

//戴尔鼠标
public class DellMouse : MouseBase
{   
    public override void Show()
    {
        Debug.Log("戴尔鼠标带给你不一样的惊喜!");
    }
}

//惠普键盘
public class HpKeyBoard : KeyBoardBase
{
    public override void Show()
    {
        Debug.Log("惠普键盘!");
    }
}

//戴尔键盘
public class DellKeyBoard : KeyBoardBase
{
    public override void Show()
    {
        Debug.Log("戴尔键盘");
    }
}

//抽象工厂基类
public abstract class FactoryBase
{
    public abstract MouseBase CreateMouse();
    public abstract KeyBoardBase CreateKeyBoard();
}

//惠普工厂
public class HpFactory : FactoryBase
{
    public override KeyBoardBase CreateKeyBoard()
    {
        return new HpKeyBoard();
    }

    public override MouseBase CreateMouse()
    {
        return new HpMouse();
    }
}

//戴尔工厂
public class DellFactory : FactoryBase
{
    public override KeyBoardBase CreateKeyBoard()
    {
        return new DellKeyBoard();
    }

    public override MouseBase CreateMouse()
    {
        return new DellMouse();
    }
}

//客户端调用
public static void main(string[] args)
{
    FactoryBase factory = new HpFactory();
    //生产惠普鼠标和键盘
    factory.CreateMouse();
    factory.CreateKeyBoard();

    factory = new DellFactory();
    //生产戴尔鼠标和键盘
    factory.CreateMouse();
    factory.CreateKeyBoard();
}

运行结果

小结:我们抽象除一个工厂基类,里面是可生产的产品,然后每个品牌作为一个工厂类去继承它,这样就把同一个品牌的产品合并到同一个工厂了。

六、设计图

通过学习,我们了解到了简单工厂模式的应用,我们把刚刚的实现方式画出来。

//没什么人看,就不画了。

 

七、总结   

        工厂模式和抽象工厂的区分为:是否有品牌多产品这一说。抽象工厂扩展起来比较麻烦,需要添加每个品牌的具体产品对象,也就是一个产品有几个牌子就得写几个类,然后还得去工厂类里加上创建得方法。但不耦合就是了。

觉得有用就留下评论吧^-^

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!