理解工厂模式

产品族与等级结构

Windows UI 产品族TextBoxCheckBoxDropdownList
Linux UI 产品族TextBoxCheckBoxDropdownList

抽象工厂

  • 一个具体工厂负责一种产品族整套产品的创建。所以具体工厂数量 = 产品族数量。这里需要两个具体工厂:WindowsUIFactory 和 LinuxUIFactory
  • 既然每个具体工厂可以创建出一个产品族的整套产品,那么他就应该具有创建每种产品的方法,即创建方法数 = 产品种类(产品等级结构)数。而抽象工厂正是用来约束没个工厂应该具有什么创建方法的。那么抽象工厂UIFactory中应该有CreateTextBox(),CreateCheckbox(),CreateDropdownList()三个抽象方法。
  • 每种产品(等级结构)都对应一个抽象产品来描述本产品的共性。有几种产品(等级结构)就需要有几个抽象产品。这里需要有:TextBox,CheckBox,DropdownList三个抽象产品。
  • 到底要进哪个工厂是由客户来选择(不能强买强卖吧)。
using System;





abstract class UIFactory

{

    public abstract TextBox CreateTextBox();

    public abstract Checkbox CreateCheckBox();

    public abstract DropdownList CreateDropdownList();

}





#region Window UI Factory



class WindowsUIFactory : UIFactory

{



    public override TextBox CreateTextBox()

    {

        return new WindowsTextBox();

    }



    public override Checkbox CreateCheckBox()

    {

        return new WindowsCheckbox();

    }



    public override DropdownList CreateDropdownList()

    {

        return new WindowsDropdownList();

    }

}



#endregion





#region Linux UI Factory



class LinuxUIFactory : UIFactory

{

    public override TextBox CreateTextBox()

    {

        return new LinuxTextBox();

    }



    public override Checkbox CreateCheckBox()

    {

        return new LinuxCheckbox();

    }



    public override DropdownList CreateDropdownList()

    {

        return new LinuxDropdownList();

    }

}



#endregion

        



abstract class TextBox

{

}



abstract class Checkbox

{

}



abstract class DropdownList

{

}





#region Window UI Family



class WindowsTextBox : TextBox

{

    public override string ToString()

    {

        return "I am a Windows TextBox.";

    }

}



class WindowsCheckbox : Checkbox

{

    public override string ToString()

    {

        return "I am a Windows Checkbox.";

    }

}



class WindowsDropdownList : DropdownList

{

    public override string ToString()

    {

        return "I am a Windwos DropdownList.";

    }

}



#endregion





#region Linux UI Family



class LinuxTextBox : TextBox

{

    public override string ToString()

    {

        return "I am a Linux TextBox.";

    }

}



class LinuxCheckbox : Checkbox

{

    public override string ToString()

    {

        return "I am a Linux CheckBox.";

    }

}



class LinuxDropdownList : DropdownList

{

    public override string ToString()

    {

        return "I am a Linux DropdownList.";

    }

}

#endregion





public class App

{

    public static void Main()

    {

        WindowsUIFactory winUIFactory = new WindowsUIFactory();

        TextBox txt = winUIFactory.CreateTextBox();

        Console.WriteLine(txt);



        LinuxUIFactory linUIFactory = new LinuxUIFactory();

        DropdownList ddl = linUIFactory.CreateDropdownList();

        Console.WriteLine(ddl);

    }

}

工厂方法模式

工厂方法模式就好比是抽象工厂模式的缩水版。当只有一种产品(等级结构)时就退化为工厂方法模式。比如只有UI家族中只有TextBox。

工厂模式的优点及缺点

很好地支持产品族的增加,而对产品种类(等级结构)的增加支持不好。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值