设计模式(个人理解版)

本文概述了创建型(如工厂方法、抽象工厂、单例、建造者和原型),结构型(适配器、装饰器、代理、桥接、外观、组合和享元)和行为型(策略、模板方法、观察者等)的设计模式。通过实例展示了工厂方法如何制造汽车,抽象工厂如何创建组件,单例如何实现对象唯一,以及建造者和原型模式的区别。
摘要由CSDN通过智能技术生成

创建型模式:共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 结构型模式:共7种:适配器模式、装饰器模式、代理模式、桥接模式、外观模式、组合模式、享元模式 行为型模式:共11种:策略模式、模板方法模式、观察者模式、责任链模式、访问者模式、中介者模式、迭代器模式、命令模式、状态模式、备忘录模式、解释器 ————————————————

工厂方法:接口:汽车工厂 实现类:宝马工厂、奔驰工厂

抽象工厂:接口:发动机 实现类:发动机A 发动机B

接口:空调 实现类:空调A 空调B

接口:工厂【制造发动机、空调】 实现类:宝马1(发动机A 空调B) 宝马2(发动机B 空调A)

单例:

//懒汉式单例类.在第一次调用的时候实例化自己 
public class Singleton {
    private Singleton() {}
    private static Singleton single=null;
    //静态工厂方法 
    public static Singleton getInstance() {
         if (single == null) {  
             single = new Singleton();
         }  
        return single;
    }
}

建造者==原型模式:

(1)原型模式比 new 方式创建对象的性能要好的多,因为 Object 类的 clone() 方法是一个本地方法,直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显;

(2)简化对象的创建;原型模式适合在重复地创建相似对象的场景使用,比如在一个循环体内创建对象

Object 类的 clone() 方法只会拷贝对象中的基本的数据类型(8种基本数据类型 byte,char,short,int,long,float,double,boolean 和对应的封装类),对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。

深拷贝:把要克隆的对象所引用的对象都克隆了一遍

接口:Cloneable 实现类:Prototype

类:ShallowClone继承Prototype

浅拷贝:

public class ShallowClone extends Prototype {
    @Override
    public Prototype clone(){
        Prototype prototype = null;
        try {
            prototype = (Prototype)super.clone();
        }
        catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return prototype;
    }

深拷贝:

public class DeepClone extends Prototype {
    @SuppressWarnings("unchecked")
    @Override
    public Prototype clone() {
        Prototype prototype = null;
        try {
            prototype = (Prototype)super.clone();
        }
        catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        //区别 要把引用也拷贝
        prototype.list = (ArrayList<String>) this.list.clone();
        return prototype;
    }

适配器: 一个插座,只可以插欧洲的插头,有一个亚洲的插头,需要用适配器转接

三种:类、对象、接口

1、已有的类、方法【只能插欧洲插头的插座】:Adaptee

2、目标接口【可以插亚洲插头的插座】:target【中间者】

实现类【适配器类】:Adapter extends Adaptee imple target

装饰器:

*装饰者与被装饰者都拥有共同的超类,但这里继承的目的是继承类型,而不是行为。*

接口:Human 方法:穿衣服【被装饰者】

装饰器类:Decorator 继承 Human

   abstract class Decorator implements Human
{
​    private Human human;

   public Decorator(Human human)
   {
       this.human = human;
  }
   @Override
 ​    public void wearClothes()
 ​    {//这个的意思是什么
 ​        human.wearClothes();
 ​    }
 }

Decorator1 继承Decorator 增加进房子的方法

Decorator2 继承Decorator 增加去衣柜的方法

Decorator3 继承Decorator 增加找衣服的方法

普通类:Person继承Human

代理模式:某天你看到一位女生,一见钟情,心里发誓要她做你女朋友,但是你想这样直接上去可能会唐突了。于是你采用迂回政策,先和她室友搞好关系,然后通过她室友给她礼物,然后……。

首先出现的就是美女一枚:BeautifulGirl 属性:她的名字

接口:送礼物 方法:送花、送巧克力、送车

普通类:我继承送礼物

代理类:美女的闺蜜

   public class HerChum implements GiveGift{
	//重点
    You you;
    public HerChum(BeautifulGirl mm){
       you = new You(mm);}

桥接模式:

假如你有一个几何形状Shape类,从它能扩展出两个子类: 圆形Circle和 方形Square 。 你希望对这样的类层次结构进行扩展以使其包含颜色,所以你打算创建名为红色Red和蓝色Blue的形状子类。 但是, 由于你已有两个子类, 所以总共需要创建四个类才能覆盖所有组合, 例如 蓝色圆形Blue­Circle和 红色方形Red­Square 。 我们可以将颜色相关的代码抽取到拥有 红色和 蓝色两个子类的颜色类中, 然后在 形状类中添加一个指向某一颜色对象的引用成员变量

接口:颜色 实现类:红色、蓝色

抽象类:形状,颜色是他的成员变量 抽象方法:

普通类:圆形、方形继承 形状

外观模式:

实现类:CPU 方法:开机、关机

Memory 方法:开机、关机

Disk 方法:开机、关机

电脑-》成员:CPU Memory Disk

方法:开机、关机

主类:new 电脑就可以了

组合模式:

文件夹-文件-删文件/添加文件/修改文件

类:文件 属性:名字 方法:展示

类:文件夹 继承 文件 方法:删除、添加

类:具体文件 继承 文件 方法:重写展示

享元模式:

数据库连接池、线程池等都是用享元模式的应用。

假如我们有一个绘图的应用程序,通过它我们可以出绘制各种各样的形状、颜色的图形,那么这里形状和颜色就是内部状态了,通过享元模式我们就可以实现该属性的共享了。

抽象类:shape

具体类:圆形 继承 shape

享元类: 享元工厂

//核心类 public class FlyweightFactory{ static Map<String, Shape> shapes = new HashMap<String, Shape>();

public static Shape getShape(String key){
    Shape shape = shapes.get(key);
    //如果shape==null,表示不存在,则新建,并且保持到共享池中
    if(shape == null){
        shape = new Circle(key);
        shapes.put(key, shape);
    }
    return shape;
}
​public static int getSum(){
    return shapes.size();
}

main:

  1. Shape shape1 = FlyweightFactory.getShape("红色");

  2. shape1.draw();

策略模式:

刘备要到江东娶老婆了,走之前诸葛亮给赵云三个锦囊妙计,说是按天机拆开能解决棘手问题。场景中出现三个要素:三个妙计(具体策略类)、一个锦囊(环境类)、赵云(调用者)。

接口:策略 方法:行动的方法

三个实现类,都继承策略,并重写方法

环境类:Context ,策略是成员变量

模板方法模式:准备去学校所要做的工作(prepareGotoSchool)为例,假设需要分三步:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings)。学生和老师要做得具体事情肯定有所区别

//抽象类定义整个流程骨架
public abstract class AbstractPerson{
     //模板方法,使用final修改,防止子类改变算法的实现步骤
     public final void prepareGotoSchool(){
          dressUp();
          eatBreakfast();
          takeThings();
     }
     //以下是不同子类根据自身特性完成的具体步骤
     protected abstract void dressUp();
     protected abstract void eatBreakfast();
     protected abstract void takeThings();
}

实现类:学生、教师都继承AbstractPerso

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值