23设计模式全解

各模式的重要等级(最高五颗星):

简单工厂模式:※※※※

工厂方法模式:※※※※※

抽象工厂模式:※※※※※

建造者模式:※※

原型模式:※※※

单例模式:※※※※ 


适配器模式:※※※※

桥接模式:※※※

组合模式:※※※※

装饰模式:※※※

外观模式:※※※※※

享元模式:※

代理模式:※※※※


职责链模式:※※

命令模式:※※※※

解释器模式:※

迭代器模式:※※※※※

中介者模式:※※

备忘录模式:※※

观察者模式:※※※※※

状态模式:※※※

策略模式:※※※※

模板方法模式:※※※

访问者模式:※ 

一、类图简述

  

类之间的关系

1.关联关系

描述的是:一个对象请求另一个对象的服务

体现:在一个类中声明另一个类的对象,然后使用另一个类的服务

关联关系如下类型

(1)双向关联及对应的java代码

        默认情况下关联是双向的,用一条实线连接两个类,这条线叫关联路径。

(2)单向关联及对应的java代码

        用带箭头的实线表示

(3)自关联及对应的java代码

      在类中嵌套自身类型的对象

 (4)多重性关联及对应的java代码

        放在关联端,表示源端的一个对象可以与另一端的多少个对象相关联

 (5)聚合关系及代码体现

描述整体和部分的关系,部分可以脱离整体独立存在;说明整体和部分的请求服务关系

 实现:因为部分可以脱离整体而存在,所以先在整体类中中声明部分类的对象,然后再通过构造注入或设置注入的方式将部分类的实例传入进来

(6)组合关系及代码体现

描述整体和部分的关系,整体对象不存在,部分对象也跟着不存在;说明整体和部分的请求服务关系

 实现:①先在整体类中声明部分类的对象,②然后在整体类的构造方法中实例化部分类的对象。这样做可以在创建整体类对象时同时创建部分类对象,销毁整体类对象时同时销毁部分类对象

2.依赖关系

依赖关系是一种使用关系,一个事物变化会影响另一个事物

体现:在某个类的方法中使用另一个类的对象作为参数

 3.泛化关系

泛化关系其实就是继承,用于描述父类与子类之间的关系

4.实现关系


二、面向对象设计原则

1.单一职责原则:一个类应该只包含单一的职责(单一的职责:一个逻辑的方法)

2.开闭原则:软件实体对扩展开放,对修改关闭(软件实体:类、方法、模块)

开闭原则分析:抽象是开闭原则的关键,在java、C#等面向对象编程语言中,应该为系统定义一个相对稳定的抽象层,将不同的功能在具体的实现层中完成

3.里氏代换原则:在所有使用基类对象的地方都可以使用其子类对象来代替(用基类声明对象,而用子类来实例化)

4.依赖倒置原则:要针对接口或抽象类编程,而不是针对具体类编程(父类型的引用指向子类型的对象)

DIP中经常被提及的两个概念

  • 类之间的耦合
  • 依赖注入::将一个类的对象传入到另一个类里面,传入时要尽量注入父类对象,在程序运行时再通过子类对象覆盖父类对象

                注入方式:

                        构造注入:通过本类的构造函数注入其他类的实例对象

                        设值注入:通过Setter方法注入实例对象

                        接口注入:通过接口方法注入实例对象

5.接口隔离原则:客户端不应该依赖那些它不需要的接口

6.合成复用原则:要尽量使用关联(组合/聚合)关系,少用继承来达到复用的目的

7.迪米特法则(最少知识原则):一个软件实体要尽可能少的与其他实体发生相互作用


三、设计模式概述

设计模式的定义:一套解决相同、相似问题的模板

基本要素:

1.模式名称

2.问题:在何时使用模式

3.解决方案:描述设计模式的组成部分,以及组成成分之间的关系

4.效果:主要包含模式的优缺点分析

设计模式的分类:

目的可分为创建型、结构型、行为型三种:

(1)创建型模式主要用于  解决创建对象的问题

(2)结构型模式用于 把类或对象结合在一起形成更大的结构

结构型模式可以描述两种不同的东西:类和对象,根据这个,结构型模式又可以分为:

类结构型模式:类结构型模式关心类的组合,由多个类可以组成一个更大的系统;一般只存在继承关系和实现关系;

对象结构型模式:对象型模式关心类和对象的组合;通过关联关系使得在一个类中定义另一个类的实例对象,然后通过此对象调用其方法

分析:根据合成复用原则,在系统中要尽量使用关联关系来替代继承关系,所有大部分结构型模式都是对象结构型模式

(3)行为型模式主要用于 解决类或对象之间的交互问题。


简单工厂模式

模式动机

模式定义:

定义一个类来创建其他类的实例,根据参数的不同创建不同类的实例,被创建的实例通常具有共同的父类,属于类创建型模式,又叫作静态工厂方法模式。

简单工厂模式的结构图&包含的角色:

结构图:

包含的角色:

1. Product(抽象产品角色):即抽象产品类,是具体产品的父类,负责描述所有实例共有的公共接口。

解析:可以是一个接口也可以是一个抽象类,其中声明了所有产品都有的抽象业务方法。

2. ConcretePreduct(具体产品角色):是简单工厂模式的创建目标。

解析:是抽象产品类的子类,是具体的产品,每个具体产品角色都继承了抽象产品角色,需要实现抽象产品中的抽象业务方法

3. Factory(工厂类角色):即工厂类,简单工厂模式的核心,实现创建实例对象的内部逻辑。

解析:在工厂类里面定义了一个静态的工厂方法,其包含一个字符串类型的参数,在方法体中根据不同的参数实例化不同的具体产品对象,并返回。

简单工厂模式实例与解析:

使用简单工厂模式来实现这个实例

实例说明:某电视机专为各知名电视机品牌代工生产各类电视机,当需要海尔电视机时只需要在调用工厂的工厂方法时传入参入Haier,需要海信电视机时传入参数Hisense。工厂方法就可以根据传入参数的不同创建并返回不同品牌的电视机。

实例类图

实例代码

(1)抽象产品类TV(电视机类)

public interface TV{
    public void play();
}

TV充当抽象产品角色,可以是接口也可以是抽象类,其中包含了所有产品都有的抽象业务方法Play()

(2)具体产品类HaierTV(海尔电视机类)

public class HaierTV implements TV{
    public void play(){
        System.out.println("海尔电视机播放...");
    }
}

HaierTV是抽象产品TV接口的子类,是具体的产品,实现了TV接口中定义的业务方法play()

(3)具体产品类HisenseTV(海信电视机类)

public class HisenseTV implements TV{
    public void play(){
        System.out.println("海信电视机播放...");
    }
}

HisenseTV是抽象产品TV接口的子类,另一个具体产品

(4)工厂类TVFactory(电视机工厂类)

public class TVFactory{
    public static TV productTV(String brand)throws Exception{   //静态方法
        if(brand.equalsIgnoreCase("Haier")){            //根据不同的参数实例化出不同的具体产品对象
            System.out.println("工厂生产海尔电视机");
            return new HaierTV();
        }
        else if(brand.equalsIgnoreCase("Hisense")){
            System.out.println("工厂生产海信电视机");
            return new HisenseTV();
        }
        else{
                throw new Exception("暂不生产该brand的电视机!");
        }
    }
}

TVFactory作为工厂类,是简单工厂模式的核心,在里面定义了静态的工厂方法productTV(),其有一个字符串类型的参数,在方法体中根据参数的不同实例化不同的具体产品类对象,并返回

优缺点

优点:

缺点:

适用环境

1. 工厂类负责创建的对象比较少(由于创建的对象少,所以不会造成工厂方法中的业务逻辑过于复杂)

2. 客户端不需要关心对象的创建细节,只需要知道类型所对应的参数即可获得对象


工厂方法模式(一个具体工厂类对应实例化一种具体产品对象)

模式动机

模式定义:

工厂方法模式又称工厂模式,也叫虚拟构造器模式和多态工厂模式,属于类创建型模式。通过定义抽象工厂父类负责定义创建产品对象的公共接口,工厂子类则负责创建具体的产品对象。

工厂方法模式结构图&包含的角色:

结构图:

包含的角色:

1. Product(抽象产品):抽象产品角色,可以是一个抽象类也可以是一个接口,其中定义了所有产品都具有的抽象业务方法

2. ConcretePreduct(具体产品):具体产品类实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,它们存在一对一的关系。

解析:是抽象产品类的子类,是一种具体的产品,每个具体产品角色都继承了抽象产品角色,需要实现抽象产品中的抽象业务方法

3. Factory(抽象工厂):是工厂方法模式的核心,任何在模式中创建对象的工厂类都必须实现该接口,用于创建并返回一个产品

解析:可以是一个接口也可以是一个抽象类,在抽象工厂中定义了抽象的工厂方法用于创建和返回抽象产品类型的对象

4. ConcreteFactory(具体工厂):抽象工厂类的子类,并可由客户调用返回一个具体产品类的实例。

解析:抽象工厂类的子类,实现了抽象工厂中的抽象工厂方法工厂方法中创建并返回一个具体产品类的实例

工厂模式的实例与解析

工厂模式实例之电视机工厂

实例说明:某电视机工厂专为各电视机品牌代工生产各类电视机,当需要海尔电视机时只需要在调用工厂的工厂方法时传入参入Haier,需要海信电视机时传入参数Hisense。工厂方法就可以根据传入参数的不同创建并返回不同品牌的电视机。

实例类图:

实例代码及解释:

(1)抽象产品类TV(电视机类)

public interface TV{
    public void play();
}

TV是抽象产品类,可以是接口也可以是抽象类,里面定义了所有产品的抽象业务方法play()

(2)具体产品类HaierTV(海尔电视机类)

public class HaierTV implements TV{
    public void play(){
        System.out.println("海尔电视机播放....");
    }
}

HaierTV抽象产品TV接口的子类,是一种具体的产品,实现了TV接口中的抽象业务方法

(3)具体产品类HisenseTV(海信电视机类)

public class HisenseTV implements TV{
    public void play(){
        System.out.println("海信电视机播放....");
    }
}

(4)抽象工厂类TVFactory(抽象电视机工厂类)

public interface TVFactory{
    public TV produceTV();     //定义抽象的工厂方法
}

可以是一个接口也可以是一个抽象类,它里面定义了抽象的工厂方法produceTV(),创建并返回抽象产品TV类型的对象

(5)具体工厂类HaierTVFactory(海尔电视工厂)

public class HaierTVFactory implements TVFactory{
    public TV produceTV(){
        System.out.println("海尔电视机工厂生产海尔电视"); //实现了抽象工厂方法produceTV(),在工厂方法中创建并返回一个具体产品对象
        return new HaierTV();
    }

HaierTVFactory是具体的工厂类,是抽象工厂类TVFactory的子类,实现了抽象工厂方法produceTV(),在工厂方法中创建并返回一个具体产品对象

(6)具体工厂类HisenseTVFactory(海信电视工厂类)

public class HisenseTVFactory implements TVFactory{
    public TV produceTV(){
         System.out.println("海信电视机工厂生产海信电视"); 
         return new HisenseTV();
    }

优缺点

优点:

缺点:

适用环境:


抽象工厂模式(抽象工厂模式与工厂方法模式最大的区别:抽象工厂中的每个工厂可以创建多种产品;而工厂方法的每个工厂只能创建一种的产品)

两个概念:

产品等级结构:多个品牌下的同种类产品(如相同类型的电器构成了一个产品等级结构)

产品族:一个品牌下的多种不同类产品(如相同品牌的电器构成一个产品族)

模式动机

模式定义:

提供一个创建一系列相关或相互依赖的对象的接口,而无须指定它们具体的类,属于对象创建型模式(用一个具体工厂实现抽象工厂就可以生产一个产品族,也就是多种产品)

抽象工厂模式结构图&角色

结构图:

包含的角色:

AbstractFactory(抽象工厂):定义创建多种产品的多个抽象方法

ConcreteFactory(具体工厂):实现抽象工厂中创建各种产品

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单例模式:某个类只能有一个实例,提供一个全局的访问点。 简单工厂:一个工厂类根据传入的参量决定创建出那一种产品类的实例。 工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。 抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。 建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。 原型模式:通过复制现有的实例来创建新的实例。 适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。 组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构。 装饰模式:动态的给对象添加新的功能。 代理模式:为其他对象提供一个代理以便控制这个对象的访问。 亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象。 外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。 桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。 模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。 策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。 状态模式:允许一个对象在其对象内部状态改变时改变它的行为。 观察者模式:对象间的一对多的依赖关系。 备忘录模式:在不破坏封装的前提下,保持对象的内部状态。 中介者模式:用一个中介对象来封装一系列的对象交互。 命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。 访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。 责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。 迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值