一、前言
策略模式和工厂模式是两种不同的设计模式,它们有不同的目标和使用场景。
二、工厂模式和策略模式的区别
2.1 工厂模式
工厂模式提供了一种创建对象的机制,通过工厂方法来根据给定的参数返回一个对象。这种模式可以制止直接使用new操作符来创建对象,提高了代码的灵活性和可扩展性。
工厂模式适合:凡是出现了大量的产物须要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。
实现示例:
以平凡工厂模式为例
创建一个工厂类,对实现了同一接口的一些类进行实例的创建。
举例如下:(我们举一个发送邮件和短信的例子)
首先,创建二者的共同接口:
- public interface Sender {
- public void Send();
- }
复制代码 其次,创建实现类:
- public class MailSender implements Sender {
- @Override
- public void Send() {
- System.out.println("this is mailsender!");
- }
- }
复制代码- public class SmsSender implements Sender {
-
- @Override
- public void Send() {
- System.out.println("this is sms sender!");
- }
- }
复制代码 2.2 策略模式
策略模式界说了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。须要设计一个接口,为一系列实现类提供同一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下:
策略模式的决定权在用户,体系本身提供不同算法的实现,新增大概删除算法,对各种算法做封装。因此,策略模式多用在算法决策体系中,外部用户只须要决定用哪个算法即可。
实现示例:
首先同一接口:
- public interface ICalculator {
- public int calculate(String exp);
- }
复制代码 辅助类:
- public abstract class AbstractCalculator {
-
- public int[] split(String exp,String opt){
- String array[] = exp.split(opt);
- int arrayInt[] = new int[2];
- arrayInt[0] = Integer.parseInt(array[0]);
- arrayInt[1] = Integer.parseInt(array[1]);
- return arrayInt;
- }
- }
复制代码 三个实现类:
- public class Plus extends AbstractCalculator implements ICalculator {
-
- @Override
- public int calculate(String exp) {
- int arrayInt[] = split(exp,"\\+");
- return arrayInt[0]+arrayInt[1];
- }
- }
复制代码- public class Minus extends AbstractCalculator implements ICalculator {
-
- @Override
- public int calculate(String exp) {
- int arrayInt[] = split(exp,"-");
- return arrayInt[0]-arrayInt[1];
- }
- }
复制代码- public class Multiply extends AbstractCalculator implements ICalculator {
-
- @Override
- public int calculate(String exp) {
- int arrayInt[] = split(exp,"\\*");
- return arrayInt[0]*arrayInt[1];
- }
- }
复制代码 简单的测试类:
- public class StrategyTest {
-
- public static void main(String[] args) {
- String exp = "2+8";
- ICalculator cal = new Plus();
- int result = cal.calculate(exp);
- System.out.println(result);
- }
- }
复制代码 输出:10
2.3 区别
关注点不同:
策略模式关注的是算法的替换和变化,它夸大的是举动的选择和执行。
工厂模式关注的是对象的创建,它夸大的是实例化过程的控制和管理。
目标不同:
策略模式通过界说一组算法来实现举动的可替换性和灵活性。
工厂模式通过提供创建对象的接口来实现对象创建过程的解耦和灵活性。
实现方式不同:
策略模式包罗策略接口和详细策略类,通过上下文类来使用不同的策略。
工厂模式包罗工厂接口或抽象类和详细工厂类,通过工厂方法来创建对象。
应用场景不同:
策略模式适用于须要在运行时动态选择算法或举动的场景。
工厂模式适用于须要控制实例化过程,大概须要创建一系列相干对象的场景。
2.4 结合
结合使用策略模式和工厂模式,可以使体系更灵活。工厂模式用于创建详细的策略对象,而策略模式用于在运行时选择和执行这些策略。
示例:
下面的示例展示了如何结合使用策略模式和工厂模式。工厂模式负责创建策略对象,策略模式负责在运行时选择和执行策略。
策略接口
- // IStrategy.cs
- public interface IStrategy
- {
- void Execute();
- }
复制代码 详细策略
- // ConcreteStrategyA.cs
- public class ConcreteStrategyA : IStrategy
- {
- public void Execute()
- {
- Console.WriteLine("执行策略 A");
- }
- }
- // ConcreteStrategyB.cs
- public class ConcreteStrategyB : IStrategy
- {
- public void Execute()
- {
- Console.WriteLine("执行策略 B");
- }
- }
复制代码 策略工厂
- // StrategyFactory.cs
- public class StrategyFactory
- {
- public IStrategy CreateStrategy(string strategyType)
- {
- return strategyType switch
- {
- "A" => new ConcreteStrategyA(),
- "B" => new ConcreteStrategyB(),
- _ => throw new ArgumentException("Invalid strategy type")
- };
- }
- }
复制代码 上下文类
- // Context.cs
- public class Context
- {
- private IStrategy _strategy;
- public void SetStrategy(IStrategy strategy)
- {
- _strategy = strategy;
- }
- public void ExecuteStrategy()
- {
- _strategy.Execute();
- }
- }
复制代码 客户端代码
- // Program.cs
- using System;
- class Program
- {
- static void Main()
- {
- StrategyFactory factory = new StrategyFactory();
- Context context = new Context();
- // 选择策略类型,可以从配置文件、用户输入等获取
- string strategyType = "A";
-
- // 使用工厂创建策略
- IStrategy strategy = factory.CreateStrategy(strategyType);
- // 设置上下文策略并执行
- context.SetStrategy(strategy);
- context.ExecuteStrategy();
- // 切换到另一种策略
- strategyType = "B";
- strategy = factory.CreateStrategy(strategyType);
- context.SetStrategy(strategy);
- context.ExecuteStrategy();
- }
- }
复制代码 结合使用的好处
1、职责分离:
工厂模式负责创建详细的策略对象。
策略模式负责在运行时选择和执行策略。
2、扩展性强:
可以很轻易地添加新的策略,而不须要修改上下文类和客户端代码,只需在工厂中增长对应的策略创建逻辑即可。
3、代码简便:
客户端代码不须要相识策略的详细实现,只需通过工厂获取策略对象,并在上下文中使用即可。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |