| 啥是工厂模式和策略模式?


简单工厂模式与策略模式



前言

  • 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
  • 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
  • 在介绍设计模式之前需要先介绍一下面向对象的特性UML类图

面向对象的特点

  • 封装、继承、多态。

UML类图

  • 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)
  • 在UML类图中矩形框表示一个类,类分三层,第一层是;类的名称,如果是抽象类,则用斜体显示,第二层表示特性,是字段和属性,第三层表示操作,通常是方法和行为。
  • 注意前面符号,“+”表示public,“-”表示private,“#”表示protected。
  • 【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何具体化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。

    【箭头指向】:带三角箭头的实线,箭头指向父类

 

  • 【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现.

【箭头指向】:带三角箭头的虚线,箭头指向接口

  • 【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

【代码体现】:成员变量

【箭头及指向】:带普通箭头的实心线,指向被拥有者

  • 【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。

【代码体现】:成员变量

【箭头及指向】:带空心菱形的实心线,菱形指向整体

  • 【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

【代码体现】:成员变量

【箭头及指向】:带实心菱形的实线,菱形指向整体

  • 【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.

【代码表现】:局部变量、方法的参数或者对静态方法的调用

【箭头及指向】:带箭头的虚线,指向被使用者

  • 各种关系的强弱顺序:    泛化=实现>组合>聚合>关联>依赖
  • 下面这张UML图,比较形象地展示了各种类图关系:


简单工厂模式


  • 工厂模式介绍

  • 工厂模式专门负责将大量有共同接口的类实例化,工厂模式可以动态决定将哪一个类实例化,不必事先知道要实例化那一个类。
  • 工厂模式的几种形态:
  • 简单工厂模式:又称静态工厂方法模式。
  • 工厂方法模式:又称多态性工厂模式。
  • 抽象工厂模式:又称 工具箱模式。
  • 简单工厂模式的举例

   //抽象产品角色  

   publicinterfaceCar{ 

         publicvoiddrive(); 

   } 

   //具体产品角色  

   publicclassBenzimplementsCar{ 

         publicvoiddrive(){ 

           System.out.println("Driving Benz "); 

         } 

   } 

   publicclassBmwimplementsCar{ 

         publicvoiddrive(){ 

         System.out.println("Driving Bmw "); 

         } 

   } 

   //工厂类角色  

   publicclassDriver{ 

           //工厂方法.注意 返回类型为抽象产品角色  

           publicstaticCardriverCar(Strings)throwsException{ 

                 //判断逻辑,返回具体的产品角色给Client  

                 if(s.equalsIgnoreCase("Benz")) 

                       returnnewBenz(); 

                 elseif(s.equalsIgnoreCase("Bmw")) 

                           returnnewBmw(); 

                   elsethrownewException(); 

         } 

   } 



策略模式


  • 定义:它定义了算法家族,分别封装起来,让他们之间可以可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

  • Strategy类,定义了所有的支持的算法的公共接口。

       abstractclassStrategy

{

           //算法方法

           publicvoidAlgorithmInterface();

}

  • ConcreteStrategy类封装了具体的算法或行为,继承Strategy类。

  

   publicclassConcreteStrategyAextendStrategy

{

       //算法A实现方法

       publicvoidAlgorithmInterface(){

               //算法A实现方法

       }

   }

   publicclassConcreteStrategyBextendStrategy{

       //算法B实现方法

       publicvoidAlgorithmInterface(){

               //算法B实现方法

       }

   }

  • Context类,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。

   publicclassContext{

       Strategystrategy;

       publicContext(Strategystrategy){ //初始化时,传入具体的策略对象

           this.strategy=strategy;

       }

       //上下文接口

       publicvoidContextInterface(){   //根据具体的策略对象调用其算法方法

           strategy.AlgorithmInterface();

       }

   }

   //主函数代码:

   publicstaticvoidmain(String[]args){

       Contextcontext;

       //由于实例化不同的策略,在调用context.AlgorithmInterface();时,所获得的结果也不同。

       context=newContext(newConcreteStrategyA());

       context.AlgorithmInterface();

       context=newContext(newConcreteStrategyB());

       context.AlgorithmInterface();

   }


策略与工厂结合


  • 修改Context类

   publicclassContext{

       Strategystrategy=null; //声明一个接口对象

       publicContext(Stringtype){ //初始化时,在Context类中实现简单工厂的应用。

           switch(type){

           case"需求一":

               Strategys1=newConcreteStrategyA();

               strategy=s1;

               break;

           case"需求二":

               Strategys2=newConcreteStrategyB();

               strategy=s2;

               break;

           }

       }

       publicdoubleGetResult(){

           returnstrategy..AlgorithmInterface();

       }

   }

  • 简单工厂模式与策略与工厂结合的客户端代码对比

   //工厂模式用法

   Strategys=StrategyFactory.createStrategy(type);

   ...=s.GetResult();

   //策略与工厂结合

   Contextc=Context(type);

   ...=c.GetResult();

  • 总结:简单工厂模式,客户端需要两个类,Strategy和StrategyFactory,而策略与工厂结合只需要一个类,Context类。降低了耦合性。

策略模式解析


  • 策略模式是一种定义一系列算法的方法,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
  • 优点:
  • 简化单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试,
  • 将一系列行为封装到一个个类中时,可以在这些行为的类中消除条件语句。
  • 只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑运用策略模式处理这种可能性变化。

原文地址:https://www.cnblogs.com/to-string-hct/p/9362853.html

时间: 2024-08-07 08:08:21

| 啥是工厂模式和策略模式?的相关文章

【设计模式】简单工厂模式与策略模式

[前言]今天再次把<大话设计模式>一书拿出来翻了一下,对于前面一节初探中讲诉的简单工厂模式和策略模式,有了更好的理解.按照习惯,还是继续梳理梳理. [简单工厂模式]:封装(数据+算法) 简单工厂模式的特点: 每一个子类最好能做到职责单一,将每一个需要涉及的数据和算法,封装成一个独立的类. 工厂模式中的工厂类其实起到了一个调度者的角色: 2.1 工厂类可以达到将实现具体逻辑的子类隐藏的效果,只需要将自己暴露调用实例化的接口,根据工厂类提供的对外方法,在内部实现逻辑判断,并最后实例化具体的子类对象

工厂模式与策略模式之区别

设计模式有很多种,其中功能相似的很多,但是为什么还要分这么多种名字,查阅资料,我觉得下面的解释最为合理:用途不一样,名字就有区别,一把斧头用来砍人就叫凶器,用来砍柴就叫伐木斧,用来劈门就叫消防斧,这些模式的名字都是根据具体使用时的场景,联系了现实里某样东西或某种习惯而取得,所以很相似的模式行为有不同叫法. 今天我们就来研究一些工厂模式与策略模式的一些区别: 工厂模式是创建型模式,适应对象的变化. 策略模式是行为性模式,适应行为的变化 工厂模式封装对象,实例化对象后调用的时候要知道具体的方法,策略

浅谈简单工厂模式和策略模式

1.简单工厂模式如图 代码: 缺点:简单工厂模式需要客户端认识两个类,Cash和CashFactory 优点:子类的实例化被工厂封装了起来,客户端看不到 2.策略模式如图 代码: public class Context{ Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public double getResult(double money){ return strategy.a

设计模式之_简单工厂模式、工厂方法模式、抽象工厂模式 、策略模式、策略与工厂的区别(转)

一.前言 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的 幸运的是这种有病的现象在OO语言中可以避免了.下面以Java语言为基础来引入我们本文的主题:工厂模式! 二.简介

简单工厂模式和策略模式的区别

直接上代码: 简单工厂模式: ------------------------------一个抽象类   -------------------------- abstract class AbsClass { //抽象方法:提供一些列的算法操作 public abstract void acceptCash(string org); } ------------------------------2个实现类   -------------------------- //继承自抽象类 class

编程学习之简单工厂模式与策略模式

很久之前在学习c++的时候就听到老师说写代码要考虑重构,架构,在此期间学习到了一种简单工厂模式. 何为简单工厂模式呢?简单工厂模式又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 举个栗子,我们可能会遇到这类问题,假如需要一个软件,它可以计算各种图形的面积,使用简单工厂模式来构架的话就是通过创建一个工厂类,而程序运行过程中这些实例化这些具体的计算面积的算法类,然后主程序通过调用这些实例

简单工厂模式和策略模式的区别与结合

前言: 简单工厂模式和策略模式是大部分程序员,在学习设计模式时接触得最早,或在工作实践中也是用得相对比较多的两个设计模式. 一个是创建型,另一个是行为型,然而两种不同类型的模式,在某些地方也有一丝的相似之处,同时在某种场景下结合使用,能起到特别好的效果. 问题: 我觉得简单工厂模式和策略模式很相似.怎么相似?都是三个业务子类继承抽象父类,通过传入参数到容器类(工厂模式的factory类,策略模式的Content类),选择对应的类进行行为操作. 其实,UML图的确从外形上看没多大区别,但是,本质却

委派模式和策略模式

一.委派模式 委派模式(Delegate Pattern):指负责任务的调度和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果.(属于行为型模式,但它不属于GOF的23种设计模式之一.类名以Delegate和Dispatcher结尾的一般都是委派模式) 委派模式在Spring中应用非常多,大家常用的DispatcherServlet其实就用到了委派模式.现实生活中也常有委派的场景发生,例如:老板(Boss)给项目经理(Leader)

设计模式之桥梁模式和策略模式的区别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 举一个例子: 策略模式:我要画圆,要实心圆,我可以用solidPen来配置,画虚线圆可以用dashedPen来配置.这是strategy模式. 桥接模式:同样是画圆,我是在windows下来画实心圆,就用windowPen+solidPen来配置,在unix下画实心圆就用uni