Skip to content

TrueNewBee/DesignPatterns

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

设计模式pdf与源码

感悟

书从来不是看的而是用的
    在这个学习资料料乎爆炸的时代至你可以轻易就获取个T的视频,⼩手轻点就收藏堆文章但却很少去看学习的过程从不只是简单的看一遍就可以对于一些实操性的技术书籍如果真的
希望学习到知识那么定是把这本书用起来绝对不是看起来

创造者模式

1. 工厂方法模式

其是在⽗父类中提供⼀一个创建对象的⽅方法, 允许⼦子类决定实例例化对象的类型。 主要意图是定义⼀一个创建对象的接口,让其⼦类⾃己决定实例例化哪⼀一个⼯厂类,⼯厂模式使其创建过程延迟到⼦类行。

优点:业务解耦,单一职责,一个类或方法只干一件事

其实就是工厂定义了总的接口让其子类根据自身业务需求实现其方法

2, 抽象工厂模式

抽象⼯厂是一个中心⼯厂,创建其他⼯厂的模式。

抽象厂模式所要解决的问题就是在个产品族存在多个不同类型的产品(Redis集群操作系
)情况下选择的问题。⽽这种场景在业务开发中也是常多见的只不过可能有时候没有
将它们抽象化出来

3. 建造者

建造者模式所完成的内容就是通过将多个简单对象通过⼀步的组装构建出⼀个复杂对象的过程。

个复杂的构建与其表示相分离使得同样的构建过程可以创建不同的表示一些基本物料不会变,⽽其组合经常变化的时候就可以选择这样的设计模式来构建代码

4. 原型模式

便于通过克隆方式创建复杂对象也可以避免重复做初始化操作不需要与类中所属的其他类耦合等但也有一些缺点如果对象中包括了了循环引用的克隆以及类中
深度使对象的克隆都会使此模式变得异常麻烦

心得

初期是代码的优化中期是设计模式的使后期是把控全局服务的搭建不断的加强己对全局
力的把控也加深自己对细节的处理可上可下才是一个程序员最佳处理方式选取做合适的才
是最好的选择

5.单例模式

个全局使用的类频繁的创建和消费提升提升整体的代码的性能

举例

1. 数据库的连接池不会反复创建
2. spring中个单例例模式bean的生成和使用

1. 懒汉模式(线程不安全)

package com.chen;

// 1.   懒汉模式(线程不安全)

/**
 * 单例例模式有⼀一个特点就是不不允许外部直接创建,也就是 new Singleton_01() ,
 * 因此这⾥里里在默认的构造函数上添加了了私有属性 private 。
 */
public class Singleton_01 {
    private static Singleton_01 instance;

    // 私有构造器
    private Singleton_01(){
    }

    // 创建静态方法返回单例对象
    public static Singleton_01 getInstance(){
        if(null != instance) return instance;
        instance = new Singleton_01();
        return instance;
    }
}

2. 懒汉模式(线程安全,加锁)

package com.chen;

/**
 * @author TrueNewBee
 * @date 2021/4/28 13:46
 * @details 懒汉模式(线程安全)
 */

/**
 * 此种模式虽然是安全的,但由于把锁加到⽅方法上后,
 * 所有的访问都因需要锁占⽤用导致资源的浪费。
 * 如果不不是特殊情况下,不不建议此种⽅方式实现单例例模式。
 */

public class Singleton_02 {
    private static Singleton_02 instance;

    private Singleton_02(){

    }
    // 加了锁,线程安全
    public static synchronized Singleton_02 getInstance(){
        if (null != instance) return instance;
        instance = new Singleton_02();
        return instance;
    }
}

3.饿汉模式(线程安全)

package com.chen;

/**
 * @author TrueNewBee
 * @date 2021/4/28 13:49
 * @details 饿汉模式(线程安全)
 */

/**
 * 虽然是线程安全,但是一次性加载所有东西,占用过多资源,
 * 故称为 饿汉!!
 */
public class Singleton_03 {
    // 创建一个静态私有对象
    private static Singleton_03 instance = new Singleton_03();

    private Singleton_03(){
    }
    public static Singleton_03 getInstance(){
        return instance;
    }
}

4.使用类的内部类(线程安全, 墙裂推荐)

package com.chen;

/**
 * @author TrueNewBee
 * @date 2021/4/28 14:01
 * @details 使用类的内部类(线程安全) 推荐推荐推荐推荐推荐推荐推荐推荐
 */

/**
 * 使⽤用类的静态内部类实现的单例例模式,既保证了了线程安全有保证了了懒加载,
 * 同时不不会因为加锁的⽅式耗费性能
 */
public class Singleton_04 {

    // 创建私有内部类生成单例对象
    private static class SingletonHolder{
        private static Singleton_04 instance = new Singleton_04();
    }

    private Singleton_04(){
    }

    // 返回单例对象
    public static Singleton_04 getInstance(){
        return SingletonHolder.instance;
    }
}

5.双重锁校验(线程安全)

package com.chen;

/**
 * @author TrueNewBee
 * @date 2021/4/28 14:13
 * @details 双重锁校验(线程安全)
 */

/**
 * 双重锁的⽅方式是⽅方法级锁的优化,减少了了部分获取实例例的耗时。
 * 同时这种⽅方式也满⾜足了了懒加载。
 */
public class Singleton_05 {
    private static Singleton_05 instance;

    private Singleton_05() {
    }

    public static Singleton_05 getInstance() {
        if (null != instance) return instance;
        synchronized (Singleton_05.class) {
            if (null == instance) {
                instance = new Singleton_05();
            }
        }
        return instance;
    }
}

6.CAS[AtomicReference] (线程安全)

package com.chen;

/**
 * @author TrueNewBee
 * @date 2021/4/28 14:19
 * @details CAS[AtomicReference] (线程安全)
 * 由于太长了,就直接CV过来了
 */

import java.util.concurrent.atomic.AtomicReference;

/**
 * java并发库提供了了很多原⼦子类来⽀支持并发访问的数据安全
 * 性; AtomicInteger 、 AtomicBoolean 、 AtomicLong 、 AtomicReference 。
 * AtomicReference 可以封装引⽤用⼀一个V实例例,⽀支持并发访问如上的单例例⽅方式就是使⽤用了了这样的⼀一个
 * 特点。
 * 使⽤用CAS的好处就是不不需要使⽤用传统的加锁⽅方式保证线程安全,⽽而是依赖于CAS的忙等算法,依赖
 * 于底层硬件的实现,来保证线程安全。相对于其他锁的实现没有线程的切换和阻塞也就没有了了额外
 * 的开销,并且可以⽀支持较⼤大的并发性。
 * 当然CAS也有⼀一个缺点就是忙等,如果⼀一直没有获取到将会处于死循环中
 */
public class Singleton_06 {
    private static final AtomicReference<Singleton_06> INSTANCE = new
            AtomicReference<Singleton_06>();
    private static Singleton_06 instance;

    private Singleton_06() {
    }

    public static final Singleton_06 getInstance() {
        for (; ; ) {
            Singleton_06 instance = INSTANCE.get();
            if (null != instance) return instance;
            INSTANCE.compareAndSet(null, new Singleton_06());
            return INSTANCE.get();
        }
    }

    public static void main(String[] args) {
        System.out.println(Singleton_06.getInstance());
//       org.itstack.demo.design.Singleton_06@2b193f2d
        System.out.println(Singleton_06.getInstance());
//        org.itstack.demo.design.Singleton_06@2b193f2d
    }
}

7.Effective Java作者推荐的枚举单例例(线程安全)

package com.chen;

/**
 * @author TrueNewBee
 * @date 2021/4/28 14:29
 * @details Effective Java作者推荐的枚举单例例(线程安全)
 */

/**
 * Effective Java 作者推荐使⽤用枚举的⽅方式解决单例例模式,此种⽅方式可能是平时最少⽤用到的。
 * 这种⽅方式解决了了最主要的;线程安全、⾃自由串串⾏行行化、单⼀一实例例
 */
public enum Singleton_07 {
    INSTANCE;
    public void test(){
        System.out.println("hi~");
    }
}

/**
 * 调用方法
 * @Test
 * public void test() {
 * Singleton_07.INSTANCE.test();
 */

关于单例的总结

虽然只是一个很平常的单例例模式但在各种的实现上真的可以看到java的基本功的体现包括了懒汉饿汉线程是否安全静态类内部类加锁串串行化等在平时的开发中如果可以确保此类是全局可不需要做懒加载那么直接创建并给外部调用即可但如果是很多的类有些需要在用户触发一定的条件后(游戏关卡)才显示那么一定要用懒加载线程的安全上可以按需选择

结构模式

1. 适配器器模式

适配器模式要解决的主要问题就是多种差异化类型的接做统输出这在我们学习⼯⼚法模式中也
有所提到不同种类的奖品处理其实那也是适配器的应用

2. 桥接模式

桥接模式的主要作就是通过将抽象部分与实现部分离把多种可匹配的使行组合了了核实现也就是在A类中含有B类接⼝,通过构造函数传递B类的实现这个B类就是设计的桥比如第三方平台收钱吧把支付宝微信与卖鸡蛋灌饼的所连接
    

3. 组合模式

很多时候因为你的极致追求和稍有倔强的⼯匠精神,即使在⾯对同样的业务需求,你能完成出最好 的代码结构和最易于扩展的技术架构。 不要被远不能给你指导提升能⼒的影响到放弃⾃己的追求

就是把几种模式组合到一起原谅我太多没细细看可以自己去看pdf
 

4. 装饰器模式

应用场景,单点登入

装饰器起到了增强的作用	
    
装饰器主要解决的是直接继承下因功能的不断横向扩展导致类膨胀的问题,⽽用装饰器模式后就会直接继承显得更更加灵活同时这样也就不再需要考虑子类的维护
在装饰器器模式中有四个比较重要点抽象出来的点1. 抽象构件(Component) - 定义抽象接2. 具体构件(ConcreteComponent) - 实现抽象接⼝,可以是一组
3. 装饰(Decorator) - 定义抽象类并继承接中的保证一致性
4. 具体装饰(ConcreteDecorator) - 扩展装饰具体的实现逻辑

5. 外观模式

通过中间件的式实现外观模式这样的设计可以很好的增强代码的隔离性以及复用
不不仅使常灵活也降低了了每个系统都开发这样的服务带来的

6. 享元模式

技术类书籍和其他书籍不同,只要不去⽤看了也就只是轻描淡写,很难接纳和理解。就像设计模式,虽然可能看了了几遍,但是在实际编码中仍然很少会⽤,大部分原因还是没有认认真的跟着实操。事必躬亲才是学习编程的最好是⽅式。

关于享元模式的设计可以着重学习享元厂的设计些有量重复对象可复用的场景下使此场景在服务端减少接口的调⽤,在客户端减少内存的占用是这个设计模式的主要应方式

7.代理模式

除了了这些优化提升外,还有那么⼴阔的技术体系栈,都可能因为你只是注重CRUD⽽而被忽略;字节码编程、领域驱动设计架构、代理模式中间件开发、 JVM虚拟机实现原理等

代理模式有点像老大和小弟也有点像分销商主要解决的是问题是为某些资源的访问对象的类的易操作上提供方便使用的代理服务而这种设计思想的模式经常会出现在我们的系统中或者你用到过的组件中它们都提供给你一种常简单易式控制原本你需要编写很多代码的进行使的服务类

2021-05-02 17:19:18

其实还有余下10个模式,没写,大致看看,,主要是解耦,一个类干一件事,模式都差不错!

About

java设计模式与源码

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages