Java设计模式笔记

设计模式

学习视频:https://edu.csdn.net/course/play/24612/275150

单例模式:

    单例类整个程序只能有一个实例,这个类负责创造自己的对象,并确保只有一个类被创建。

 一个类只有一个实例,即一个类只有一个对象实例。

代码要点:

1.私有构造器

2.持有该类的属性

3.对外提供获取实例的静态方法

     懒汉单例模式:

                 线程不安全,致命的是在多线程不能正常工作,在第一次调用的时候实例化 

线程不安全、延迟加载(两种加同步,效率低)

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static synchronized Singleton getInstance(){
        if (instance == null) instance = new Singleton();
        return instance;
    }
}

     饿汉单例模式:

   避免了多线程的同步问题,在类初始化时,已经自行实例化 

线程安全、反射和反序列化不安全;

public class Singleton {
    private Singleton(){}
    private static Singleton instance = new Singleton();
    public static Singleton getInstance(){
        return instance;
    }
}

工厂模式

工厂方法模式的好处就提高扩展性和维护性。自己体会。

一个小米、华为不是自己建厂,而是外包给富士康。

普通工厂方法模式

根据类图去写代码,这里就不介绍怎么看了,编写步骤如下:

先写右边的,先新建一个sender接口

Sender无返回值(所以用void)

然后照着类图写两个实现类

第一个实现类,新建这个类,这个要重写send方法,来模拟下发送邮件

第二个实现类,新建这个类,这个要重写send方法,来模拟下发送短信

最后来写工厂类:,新建这个类,

工厂就是生产两个对象,如果两个都没有就返回null;

写个main测试下:

如果要调用工厂类的方法Produce(),那先引用SendrFacetory类(就是new它),见下图

运行结果:

这个框架就写完了,一个Send接口,两个实现接口的实现类,一个工厂(里面一个方法,相当于生产线生产产品),

上面的效果相当于,比较麻烦,明明可以new对象来实现,还要建一个工厂,为什么这么复杂还要建呢?

这样的方法简单简洁,比上面简洁;

一个对象看不出来,要是一会创建一个对象,一会创建一个,要200个,这种要new200次对象,但是用工厂的好处。

如果在s2 new之前输出同一句System.out.print(“helloworld),每次new对象都要写这个,如果客户要改动,你要改两百次

有一种场景,如果main函数中,Sender s= sf.produce(“maill”);//手抖多加了一个l

任何传到工厂类判断不满足条件,所以return null;那么把空值给了s,所以s.send()调用就会出现空指针异常;

解决这个问题采用下面的多个工厂方法模式;

多个工厂方法模式

右边跟普通工厂模式一样,左边有变动,增加了一个类,所以添加就行

把原来一个方法生产200种产品,拆分成两个方法各自生产一种产品。优点就是不用再传字符串了,也不考虑用户字符串传错的

问题;

main函数也修改下,不用传参数的好处

运行:

这个模式还不够好,创建是为了调用produce方法;

我们可以采用以下的静态工厂方法,可以跳过这一步(代码能越简洁越好)

静态工厂方法模式

简单的加上static静态,这就是静态的,很容易理解吧

main中就不都不需要创建对象了,这就更优秀了。

没有特殊要求一律写静态工厂模式;

一个工厂类两个工厂模式去生产不同产品,如果需要新增一个包裹,就要增加一个方法,增加方法就要修改工厂类,这就违背了开闭原则,所以就引用下面的抽象工厂

抽象工厂方法模式

工厂模式讲求开闭原则,就是不修改工厂类中已测试完毕的代码,违背了开闭原则,(也就是工厂模式写完测试通过的代码能不修改就不修改),这就是引用抽象工厂方法模式

右侧的类图跟上面一样,没有变化,左侧提供了Provider的接口,produce方法...

那根据类图写代码,左侧的新增工厂类接口

这个就是抽象行为,抽象的概念是相当于一个模板,比如我们知道一个对象的行为,但是具体是哪个行为要自己去定义,我们先把这种行为的格式先写好放在那里(如:动物都要吃着行为,但要怎么吃,坐着吃还是躺着吃,我都不管,我先把这个行为放那里),不理解的去看看抽象的概念。抽象写好后,因为没有具体实现,所以后面一般不会修改它。

然后在写实现类的接口

最后写第二个实现类接口

两个工厂类2个公共接口写完了。

我们写个main函数测试下:

运行:

跟上面的功能一模一样

小结:

 普通工厂模式:按照框架类图写代码,缺点是根据参数传值,容易误传错,所以采用下面的多个工厂模式

多个工厂模式:多写一些方法,不用一个方法负责所有的生产,可以各负责各的;优点是不用传参数,不用担心传错参数

静态工厂模式:在多个工厂模式的方法前加上static修饰,就不需要new对象,也不需要先new工厂才能调用方法,让代码简化

                         缺点是要增加一个方法就要修改工厂类,都测试通过了还要改;

抽象工厂模式:工厂模式遵循开闭原则,也就是不能随便改变工厂类的代码(特别是测试通过后),抽象就是相当于一个模板,

                         优点是要增加方法不用修改工厂类,新增一个,且与其他的互不影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试狂人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值