欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 设计模式1:C#开发中使用创建型的工厂模式和行为型的策略模式

设计模式1:C#开发中使用创建型的工厂模式和行为型的策略模式

2024/10/31 3:11:15 来源:https://blog.csdn.net/m0_67412019/article/details/141940873  浏览:    关键词:设计模式1:C#开发中使用创建型的工厂模式和行为型的策略模式

一、接口设计的好处

三大好处:解耦、可复用、可扩展。

二、简单工厂模式

【三要素】能创建具体产品的工厂、抽象产品(接口)、具体产品

【基本用法】字符串=>创建对象=>调用其方法

// 产品接口
public interface IProduct
{void Operation();
}// 具体产品 A
public class ProductA : IProduct
{public void Operation() => Console.WriteLine("ProductA Operation");//表达式主体方法写法,就是写括号
}// 具体产品 B
public class ProductB : IProduct
{public void Operation() => Console.WriteLine("ProductB Operation");
}// 工厂类
public class ProductFactory
{public static IProduct CreateProduct(string type){return type switch //简化版switch 语句,和if,else一个意思{"A" => new ProductA(),"B" => new ProductB(),_ => throw new ArgumentException("Invalid product type")};}
}// 主程序
class Program
{static void Main(){string input = "A";IProduct product = ProductFactory.CreateProduct(input);product.Operation(); // Output: ProductA Operation}
}

【思考】以下方法也可以调用接口,为什么非要用工厂模式呢?

string input = "A";
if (input=="A")
{var product = new ProductA();product.Operation();
}

        请看图,我告诉你为什么要用工厂模式:

1.假如后续我加了产品CDEFGHI...,我仅需要添加代码到工厂类和具体实现 (底层代码),而无需修改高层代码,做到了开闭原则

2.用工厂模式实现了解耦,避免了高层代码和底层代码紧密的联系,使得高层代码无需关注具体的实现过程,做到了依赖于抽象,不依赖于具体(依赖倒置原则)。

三、抽象工厂模式

【思考】简单工厂和抽象工厂的区别

简单工厂模式:适用于单一类型的对象创建。
抽象工厂模式:适合创建一系列相关的产品族,每个产品族包含多个不同类型的产品。它提供了更高的灵活性和扩展性。

【代码实现】 

// 抽象产品 A
public interface IProductA
{void OperationA();
}// 抽象产品 B
public interface IProductB
{void OperationB();
}// 具体产品 A1
public class ProductA1 : IProductA
{public void OperationA() => Console.WriteLine("ProductA1 OperationA");
}// 具体产品 B1
public class ProductB1 : IProductB
{public void OperationB() => Console.WriteLine("ProductB1 OperationB");
}// 具体产品 A2
public class ProductA2 : IProductA
{public void OperationA() => Console.WriteLine("ProductA2 OperationA");
}// 具体产品 B2
public class ProductB2 : IProductB
{public void OperationB() => Console.WriteLine("ProductB2 OperationB");
}// 抽象工厂
public interface IFactory
{IProductA CreateProductA();IProductB CreateProductB();
}// 具体工厂 1
public class Factory1 : IFactory
{public IProductA CreateProductA() => new ProductA1();public IProductB CreateProductB() => new ProductB1();
}// 具体工厂 2
public class Factory2 : IFactory
{public IProductA CreateProductA() => new ProductA2();public IProductB CreateProductB() => new ProductB2();
}// 主程序
class Program
{static void Main(){IFactory factory = new Factory1();IProductA productA = factory.CreateProductA();IProductB productB = factory.CreateProductB();productA.OperationA(); // Output: ProductA1 OperationAproductB.OperationB(); // Output: ProductB1 OperationB}
}

四、策略模式

【三要素】环境类(用户这个对象)、策略接口、实现接口

【基本用法】对象不同=>选择的策略不同=>实现策略不同 

【demo】

using System;public interface IDiscountStrategy
{double ApplyDiscount(double price);
}public class GoldMemberDiscount : IDiscountStrategy
{public double ApplyDiscount(double price){return price * 0.95; // 5% off}
}public class RegularMemberDiscount : IDiscountStrategy
{public double ApplyDiscount(double price){return price; // No discount}
}public class Ticket
{private readonly IDiscountStrategy _discountStrategy;public Ticket(IDiscountStrategy discountStrategy){_discountStrategy = discountStrategy;}public double GetPrice(double originalPrice){return _discountStrategy.ApplyDiscount(originalPrice);}
}public class Program
{public static void Main(){double originalPrice = 100.0;//策略模式:分为两步Ticket goldMemberTicket = new Ticket(new GoldMemberDiscount());//1.选择策略Console.WriteLine("Gold Member Price: " + goldMemberTicket.GetPrice(originalPrice));//2.执行策略Ticket regularMemberTicket = new Ticket(new RegularMemberDiscount());Console.WriteLine("Regular Member Price: " + regularMemberTicket.GetPrice(originalPrice));}
}

 【思考】为什么要选取策略模式?其实分析思路和工厂模式差不多:
1.符合开闭原则,新加策略可以直接加实现策略即可,而工厂模式还需要修改工厂类和实现产品。
2.消除if-else语句,将算法逻辑封装在了具体策略中,高层代码(主程序)只需要调用GetPrice 方法即可(用户的身份信息可由查表获得,无需if判断)。
3.复用性强,一套算法可以多次使用。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com