c++ 23种设计模式_23种设计模式?一目了然!

设计模式之间的关系

cc3796553924fd7afb6dc41d7daa8398.png

设计模式分类

创建型模式(5种)

处理对象创建,试图根据实际情况使用合适的方式创建对象。
  • 将系统使用的具体类封装。
  • 隐藏具体类实例创建和组合方式。

包含:工厂方法模式抽象工厂模式单例模式建造者模式原型模式

结构型模式(7种)

借由一以贯之的方式来了解元件间的关系,以简化设计。
包含: 适配器模式装饰器模式代理模式外观模式桥接模式组合模式享元模式

cb61d722a1479ceb79c8d3daf2c19cfb.png

行为型模式(11种)

用来识别对象之间的常用交流模式并加以实现。
包含: 策略模式模板方法模式观察者模式迭代子模式责任链模式命令模式备忘录模式状态模式访问者模式中介者模式解释器模式

d200aeabf19e11bb2784d6c0f307861d.png

其它(2种)

并发型模式线程池模式

设计模式六大原则(SOLID)

单一职责原则(Single Responsibility Principle)

一个类只负责一个职责
  • 代码的粒度降低了,类的复杂度降低了。
  • 可读性提高了,每个类的职责都很明确,可读性自然更好。
  • 可维护性提高了,可读性提高了,一旦出现 bug ,自然更容易找到他问题所在。
  • 改动代码所消耗的资源降低了,更改的风险也降低了。

开闭原则(Open Closed Principle)

对扩展开放,对修改关闭
在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。
实现“开-闭”原则的关键步骤就是抽象化。

里氏代换原则(Liskov Substitution Principle)

面向对象设计的基本原则之一。 任何基类可以出现的地方,子类一定可以出现
LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
里氏代换原则是对“开-闭”原则的补充。
基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

迪米特法则(最少知道原则)(Law of Demeter)

一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

接口隔离原则(Interface Segregation Principle)

使用多个隔离的接口,比使用单个接口要好
降低依赖,降低耦合。

依赖倒置原则(Dependence Inversion Principle)

开闭原则的基础。 针对接口编程,依赖于抽象而不依赖于具体

设计模式(23种)

工厂方法模式(Factory Method)

核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
核心结构有四个角色,分别是工厂;抽象产品;具体产品。
public interface ShirtProducer {
    
​
    void produceShirt();
​
}
public class ManShirtProducer implements ShirtProducer {
    
​
    @Override
    public void produceShirt() {
    
        System.out.println("produce man shirt.");
    }
​
}
public class WomanShirtProducer implements ShirtProducer {
    
​
    @Override
    public void produceShirt() {
    
        System.out.println("produce woman shirt.");
    }
​
}

简单工厂模式

建立一个工厂类,对实现了同一接口的一些类进行实例的创建

55e95e17b0d32c6287c18fad59592b3c.png
public class SimpleShirtFactory {
    
​
    public ShirtProducer produce(String shirtType) {
    
        if ("t-shirt".equals(shirtType)) {
    
            return new WomanShirtProducer();
        } else {
    
            return new ManShirtProducer();
        }
    }
​
}

简单工厂(反射)

简单工厂的改进,通过反射实现对新增产品生产的兼容,新增产品生产无需改写工厂类。

770adc7ea2278a6365ec35a8526377c2.png
public class ReflectSimpleShirtFactory {
    
​
    public ShirtProducer produce(String shirtType)
            throws ClassNotFoundException, InstantiationException, IllegalAccessException {
    
        Class<?> ShirtProducer = Class.forName(shirtType);
        return (ShirtProducer) ShirtProducer.newInstance();
    }
​
}

多个工厂方法模式

对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提 供多个工厂方法,分别创建对象

0de7b786238a0af14bea6f67acf8ad78.png
public class MultiShirtFactory {
    
​
    public ShirtProducer produceManShirt() {
    
        return new ManShirtProducer();
    }
​
    public ShirtProducer produceWomanShirt() {
    
        return new WomanShirtProducer();
    }
​
}

静态工厂方法模式

将多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可

9f810d735c49a6ed97a0d4c8dc69e220.png
public class StaticMultiShirtFactory {
    
​
    public static ShirtProducer produceShirt() {
    
        return new ManShirtProducer();
    }
​
    public static ShirtProducer produceTShirt() {
    
        return new WomanShirtProducer();
    }
​
}
凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。
​
大多数情况下,选用静态工厂方法模式。
public class ShirtFactoryMain {
    
​
    public static void main(String[] args) {
    
        System.out.println("普通工厂模式");
        SimpleShirtFactory shirtFactory1 = new SimpleShirtFactory();
        ShirtProducer shirtProducer1 = shirtFactory1.produce("shirt");
        shirtProducer1.produceShirt();
​
        try {
    
            System.out.println("普通工厂模式(反射)");
            ReflectSimpleShirtFactory shirtFactory11 = new ReflectSimpleShirtFactory();
            ShirtProducer shirtProducer11 = shirtFactory11.produce(ManShirtProducer.class.getName());
            shirtProducer11.produceShirt();
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
    
            e.printStackTrace();
        }
​
        System.out.println("多工厂方法模式");
        MultiShirtFactory shirtFactory2 = new MultiShirtFactory();
        ShirtProducer shirtProducer2 = shirtFactory2.produceManShirt();
        shirtProducer2.produceShirt();
​
        System.out.println("静态工厂方法模式");
        ShirtProducer shirtProducer3 = StaticMultiShirtFactory.produceShirt();
        shirtProducer3.produceShirt();
    }
​
}

抽象工厂模式(Abstract Factory)

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。
抽象工厂模式, 工厂方法模式的抽象化,创建多个工厂类,需要增加新的功能时,直接增加新的工厂类即可,不需要修改之前的代码。
核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

9476eb2e20531ca803d9b9541aa7f068.png
  • 抽象工厂
抽象工厂模式核心,与应用程序无关,任何在模式中创建的对象的工厂类必须实现这个接口。
  • 具体工厂
实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
  • 抽象产品
工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
  • 具体产品
实现了抽象产品角色所定义的接口。
public interface ShirtFactory {
    
​
    ShirtProducer produce();
​
}
public class MailSenderFactory implements SenderFactory {
    
    
    @Override
    public Sender produce() {
    
        return new MailSender();
    }
}
public class ManShirtFactory implements ShirtFactory {
    
​
    @Override
    public ShirtProducer produce() {
    
        return new ManShirtProducer();
    }
​
}
public class WomanShirtFactory implements ShirtFactory {
    
​
    @Override
    public ShirtProducer produce() {
    
        return new WomanShirtProducer();
    }
​
}
public class ShirtProducerMain {
    
​
    public static void main(String[] args) {
    
        System.out.println("抽象工厂模式");
        ShirtFactory shirtProvider1 = new ManShirtFactory();
        ShirtProducer shirtProducer1 = shirtProvider1.produce();
        shirtProducer1.produceShirt();
​
        ShirtFactory shirtProvider2 = new WomanShirtFactory();
        ShirtProducer shirtProducer2 = shirtProvider2.produce();
        shirtProducer2.produceShirt();
    }
​
}

建造者模式(Builder)

将各种产品集中起来进行管理,用来创建复合对象。
工厂模式关注创建单个产品,建造者模式关注创建符合对象、多个部分。

f6ddb7f625c4d9bd334d10af663692b5.png
public class ShirtProducerBuilder {
    
​
    private List<ShirtProducer> shirtProducerlist = new LinkedList<ShirtProducer>();
​
    public void produceManShirtProducer(int count) {
    
        for (int i = 0; i < count; i++) {
    
            shirtProducerlist.add(new ManShirtProducer());
        }
    }
​
    public void produceWomanShirtProducer(int count) {
    
        for (int i = 0; i < count; i++) {
    
            shirtProducerlist.add(new WomanShirtProducer());
        }
    }
​
}public class SenderBuilder {
    
    private LinkedList<Sender> senderList = new LinkedList<Sender>();
    
    public voi
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C 23种设计模式是指在软件设计中常用的23种设计模式,其中包括工厂方法模式和职责链模式等。工厂方法模式是一种创建对象的设计模式,它定义了一个用于创建对象的接口,让子类决定将哪一个类实例化,从而使得类的实例化延迟到其子类。职责链模式则是一种解除请求发送者和接收者之间耦合的设计模式,它将多个对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它。这两种设计模式都在软件设计中具有重要的应用价值,可以提高代码的灵活性和可维护性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [超详细Java入门到精通自学视频课程-08、继承:概述、案例.rar](https://download.csdn.net/download/weixin_54787054/88280693)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++——23种设计模式](https://blog.csdn.net/finghting321/article/details/105403326)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值