zoukankan      html  css  js  c++  java
  • 《大话设计模式》读书笔记(二)

    0.简单工厂模式(Simple Factory Pattern)

    解决的问题

    在开发时,很多时候都会遇到多个类有共同父类的情况。一旦类多起来就记不住名称了。如果我们希望在使用这些子类时不需要知道具体的类名,只要知道一个参数就可以给我们返回一个需要的对象,那么就用得到简单工厂模式了。

    类图结构

    s

    简单工厂模式如图所示结构,这个类图中包含三类角色:

    1. Factory(工厂角色)

      工厂角色即工厂类,它是该模式的核心角色。工厂类中提供了核心方法factoryMethod(),返回一个抽象产品类,即所有的具体产品类的父类。

    2. Prodcut(抽象产品角色)

      抽象产品角色是简单工厂模式中所有对象的父类,负责描述所有实例共有的公共接口。

    3. ConcreteProduct(具体产品角色)

      具体产品角色是简单工厂模式的创建目标。

    其中,核心类Factory大概长这样:

     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    public class Factory{
        public static Product factoryMethod(String arg){
            if(arg.equals("A")){
                return new ConcreteProductA();
            }
            if(arg.equals("B")){
                return new ConcreteProductB();
            }
        }
    }
    

    好处与坏处

    大致来讲,简单工厂模式通过一个工厂类封装了具体的获得实现类的逻辑,使得使用者不需要知道具体的实现类即可很快的获得一个需要的实体类。

    但由于工厂类包含了所有的逻辑,一旦其崩溃,则整个系统都会崩溃。同时随着类的增多需要不断修改工厂类,工厂类的业务逻辑会十分复杂,违背了开闭原则。

    Tips

    可以看到,这里对简单工厂模式标注的是0,代表他并不属于23种设计模式。但为什么还需要了解他呢,因为他使用的实在是太频繁了,而且了解简单工厂模式可以更好的理解23种设计模式中的工厂方法模式。

    1.策略模式(Strategy Pattern)

    解决的问题

    策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同。因此,我们可以使用策略模式解决相同概念但不同实现的工作,如商场打折。

    类图结构

    假设我们现在有一个超市正在举行打折活动,打折活动分为两种——1.打折收费 2.返利收费。我们通过策略模式实现这个需求。

    类图如下:

    image-20201121132825914

    在这个类图中,CashContext类通过构造方法传入具体的收费策略,然后根据不同的收费策略来获得计算结果:

     
    public class CashContext{
        private CashSuper cs;
        public CashContext(CashSuper cs){
            this.cs = cs;
        }
        public double getResult(double money){
            return cs.acceptCash(money);
        }
    }
    

    而CashNormal、CashRebate、CashReturn这三个类都继承自CashSuper类,实现了acceptCash()方法:

     
    public class CashNormal extends CashSuper{
        @override
        public double acceptCash(double money){
            return money;
        }
    }
    

    这样,我们在使用的时候只需要new一个CashContext对象,然后传入对应的子类即可。

    好处与坏处

    策略模式的好处十分显而易见,外部不需要知道内部的具体实现,只需要调用同样的方法就可以做出不同的实现。可以很好地提取出公共功能。

    坏处也很明显,策略模式并没有减轻客户端需要判断的压力。我们可以使用策略模式+简单工厂模式的方式来减轻客户端的职责。

    总结

    这次的博客是开篇之章,主要是复习了类图的基本概念,并记录了简单工厂模式和策略模式。

  • 相关阅读:
    button 垂直分布
    GitHub上值得关注的iOS开源项目
    电脑连接网络(网络正常),但不能上网,登录网页提示dns_probe_finished_no_internet
    android 模拟应用因内存不足被后台杀死命令
    android 屏幕划分
    android 没有root的手机导出数据库
    移动硬盘不能识别,设备管理器中显示黄色感叹号
    低功耗蓝牙开发(BLE)
    音视频学习笔记
    Java中为什么要使用线程池?如何使用?
  • 原文地址:https://www.cnblogs.com/hang-hang/p/14871997.html
Copyright © 2011-2022 走看看