程序员的知识教程库

网站首页 > 教程分享 正文

293.C# 设计模式:抽象工厂模式(抽象工厂模式实现)

henian88 2024-10-18 05:58:09 教程分享 2 ℃ 0 评论

摘要


抽象工厂模式是一种创建型设计模式,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在编程中,抽象工厂用于处理大量相关的依赖关系,而不需要指定它们具体的类。

正文


应用场景

抽象工厂模式通常适用于以下场景:

  • 当一个类需要其子类来指定创建对象时。
  • 当一个类希望由其子类来实现它的实例。
  • 当一个类不能预见它需要创建哪种类的对象。

优势与劣势

优势

  • 抽象工厂模式可以确保一个应用使用同一套产品,这使得产品之间的互操作性得以实现。
  • 抽象工厂模式可以避免客户端与具体产品类的耦合。
  • 你可以从具体工厂类中提取出其公共的代码。

劣势

  • 由于使用了大量的类和接口,代码可能会变得比较复杂。
  • 在产品族中增加新的产品是很困难的,它需要修改抽象工厂和所有的子工厂。

例子

//接口IButton
public interface IButton
{
    string Paint();
}

//接口ICheckBox
public interface ICheckBox
{
    string Paint();
}

public class MacButton : IButton
{
    public string Paint()
    {
        return "Mac 样式的Button";
    }
}

public class MacCheckBox: ICheckBox
{
    public string Paint()
    {
        return "Mac 样式的Checkbox";
    }
}

public class WinButton : IButton
{
    public string Paint()
    {
        return "Window 样式按钮";
    }
}

public class WinCheckBox : ICheckBox
{
    public string Paint()
    {
        return "Window 样式CheckBox";
    }
}

// 抽象工厂
public interface IGUIFactory
{
    IButton CreateButton();
    ICheckBox CreateCheckBox();
}

//Mac 具体工厂
internal class MacFactory : IGUIFactory
{
    public IButton CreateButton()
    {
        return new MacButton();
    }

    public ICheckBox CreateCheckBox()
    {
        return new MacCheckBox();
    }
}

// Windows 具体工厂
internal class WinFactory : IGUIFactory
{
    public IButton CreateButton()
    {
        return new WinButton();
    }

    public ICheckBox CreateCheckBox()
    {
        return new WinCheckBox();
    }
}

界面开发

private void btnMac_Click(object sender, EventArgs e)
{
    //通过工厂创建了button与checkbox
    MacFactory factory=new MacFactory();
    IButton button=factory.CreateButton();
    ICheckBox checkBox=factory.CreateCheckBox();
    MessageBox.Show(button.Paint());
    MessageBox.Show(checkBox.Paint());
}

private void btnWindows_Click(object sender, EventArgs e)
{
    //通过工厂创建了button与checkbox
    WinFactory factory = new WinFactory();
    IButton button = factory.CreateButton();
    ICheckBox checkBox = factory.CreateCheckBox();
    MessageBox.Show(button.Paint());
    MessageBox.Show(checkBox.Paint());
}

IGUIFactory是抽象工厂,MacFactory和WinFactory是具体工厂,IButton和ICheckBox是抽象产品,MacButton、MacCheckBox、WinButton和WinCheckBox是具体产品。

客户端代码选择并创建一个具体工厂,然后使用这个工厂创建产品。这样,客户端代码与具体产品类解耦,只依赖于抽象产品类和抽象工厂。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表