监考老师很好,下半年继续

简介: 监考老师很好,下半年继续

hello,大家好,我是了不起。

六月底,了不起为了软考,一天来回5个小时的地铁差点让我破大防了兄弟们

而且软考那天下午题迟到了,原因居然是太过匆忙,地铁走错了线,而且是连续走错了两次,两次都走到了回家的地铁线上了。

赶到考场的时候,门都关了。

那一瞬间真的感觉自己要祭了,还好命大。老师说还没迟到太多,所以放我进去了。

但是心态是真的崩了,估计下半年继续了。希望不要还是那个考场,在山庄深处。去学校的路就是爬山,那天真的是又热又慌啊。

唠叨时间结束了,该进入我们的真实学习分享吧。

今天从头学习设计模式,为了学他呢,说真的,很多人工作后认为寻常的crud根本就和设计模式没有关系。其实不尽然,只是我们没有发散思维的去怎么运用罢了,而且能否使用的前提还得是设计模式基础是否扎实。

设计模式

设计模式要素

设计模式代表的是我们周围不断重复发生的问题,以及如何解决该问题的核心方案,我们只有使用同一套方案,才可不必做一次又一次的重复工作。所以设计模式的核心不在如何抽象,而在于提供核心的解决方案。

用代码的话来说,如何在不同的场景可以复用同一套代码设计和体系结构是设计模式需要考虑的。

用原话来说,就是设计模式使得人们更加方便地复用成功的设计和体系结构

基本要素

设计模式有四项基本要素。

  • 模式名称(Pattern Name)
  • 问题(Problem)
  • 解决方案(Solution)
  • 效果(Consequences)

分类

根据设计模式的目的,可以分为三大类:创建型模式,结构型模式,行为型模式。

  • 创建型模式是与对象的创建有关的。
  • 结构型模式处理的是类或对象的组合。
  • 行为型模式是对类或对象怎么交互和怎么分配职责进行描述的。

这三类也可以分成两种,一种对于类来说,一种对于对象来说。


创建型 结构型 行为型
工厂方法模式(Factory Method) 适配器模式(类)(Adapter) 解释器模式(Interpreter)
模板方法模式(Template Method)
对象 抽象工厂模式(Abstract Factory)
生成器模式(Builder)
原型模式(Prototype)
单例模式(Singleton)
适配器模式(对象)(Adapter)
桥接模式(Bridge)
组合模式(Composite)
装饰模式(Decorator)
外观模式(Facade)
享元模式(Flyweight)
代理模式(Proxy)
责任链模式(China of Responsibility)
命令模式(Command)
迭代器模式(Iterator)
终极者模式(Mediator)
备忘录模式(Memento)
观察者模式(Observer)
状态模式(State)
策略模式(Strategy)
访问者模式(Visitor)

PS:如果你要备考软考中级,这23种设计模式是要背的。

看完文章,那就来道软考题检查一下学习成果

在面向对象软件开发过程中,采用设计模式 ____,

A:以复用成功的设计

B:以保证程序的运行速度达到最优值

C:以减少设计过程中创建的类的个数

D:允许在非面向对象程序设计语言中使用面向对象的概念

答案:选 A,不懂的重新看一遍上面要素吧

什么是创建型设计模式?

创建型模式是对实例化过程进行的抽象,它能帮助一个系统独立于如何创建、组合和表示系统中的对象。注意力,这个一般要考的!

  • 类创建型模式:使用继承改变被实例化的类
  • 对象创建型模式:将实例化委托给另外一个对象

简单工厂模式

简单工厂模式属于创建型模式,但是它不属于23中的一种。

这里有三类角色:

  • 工厂(Factory):它是负责实现创建所有产品的内部逻辑,工厂类可以被外界直接调用,创建所需对象。
  • 抽象产品(abstract):它是工厂类所创建的所有类的父类。里面封装了这个产品的所有公共方法,细节由子类对象去实现。
  • 产品(Product):它是简单工厂模式的创建目标,它会实现抽象产品定义的所有方法。

直接上代码

从Product开始,定义一个抽象的产品

abstract class Product{
        public abstract void method();
}

再定义两个抽象实现类ProductA、ProductB

class ProductA extends Product{
    @Override
    public void method()
    {
        System.out.println("产品A");
    }
}
class ProductB extends Product{
    @Override
    public void method()
    {
        System.out.println("产品B");
    }
}

最后在定义一个创建对象的简单工厂类

class Factory {
    public static Product createProduct(String type){
        Product product = null;
        switch (type){
            case "A":
                product = new ProductA();
                break;
            case "B":
                product = new ProductB();
            default:
                System.out.println("未匹配type");
                break;
        }
        return product;
    }
}

之后只需要在main函数中对Factory进行调用就行了,由于createProduct方法是static静态的,我们也不需要new一个对象出来,直接通过Factory.createProduct()调用即可。

public static void main(String[] args)
{
    Product productA = Factory.createProduct("A");
    productA.method();
    Product productB = Factory.createProduct("B");
    productB.method();
}

一个简单的工厂模式就这么实现了。但是这种会存在问题。比如,我多一个实现类ProductC,那么收到影响的就还有Factory的createProduct方法,需要再加一个case。

class ProductC extends Product{
    @Override
    public void method()
    {
        System.out.println("产品C");
    }
}
class Factory {
    public static Product createProduct(String type){
        Product product = null;
        switch (type){
            case "A":
                product = new ProductA();
                break;
            case "B":
                product = new ProductB();
            case "C":
                product = new ProductC();
            default:
                System.out.println("未匹配type");
                break;
        }
        return product;
    }
}

但是这种设计违反了开启-关闭原则,对扩展开启,对修改关闭。在实际项目上容易导致,修改后,旧代码发生异常。

不过这也是工厂方法模式的诞生缘由。

工厂方法模式意图:定义一个用于创建对象的接口,让子类决定实例化哪个类。让Factory的实例化延续到子类身上。

其中:

  • Product:定义工厂方法所创建的对象接口
  • ConcreteProduct:实现Product定义的接口
  • Creator:声明工厂方法,它会return一个Product类型的对象。
  • ConcreleCreator:重写工厂方法,返回一个ConcreteProduct对象实例。

一般适用于

  • 当一个类不知道它所创建的对象类的时候
  • 当一个类希望由它的子类来指定它需要创建的对象的时候
  • 当类将创建对象的职责委托给子类中的某个子类,且你希望它是子类代理者这一信息局部化的时候

工厂方法模式

讲讲怎么从简单工厂转成工厂方法模式。

通过上图,我们来对应修改代码s

由抽象类abstract改成接口类interface,再对Factory抽象出一层接口类

interface Product{
   void method();
}
interface Factory {
   Product createProduct();
}

由继承类extends改成实现实现类implements

class ProductA implements Product{
    @Override
    public void method()
    {
        System.out.println("产品A");
    }
}
class ProductB implements Product{
    @Override
    public void method()
    {
        System.out.println("产品B");
    }
}
class FactoryA implements Factory{
    @Override
    public Product createProduct(){
        return new ProductA();
    }
}
class FactoryB implements Factory{
    @Override
    public Product createProduct(){
        return new ProductB();
    }
}

Main主函数由 类+方法命调用改成 new一个对象

public static void main(String[] args)
{
    FactoryA factoryA = new FactoryA();
    Product productA = factoryA.createProduct();
    productA.method();
    FactoryA factoryB = new FactoryA();
    Product productB = factoryB.createProduct();
    productB.method();
}

这里运用到了多态,所以即便新加了个ProductC也只是新增,而不需要修改,符合对修改关闭,对拓展开启的原则。

结束

这次的学习就到这里先结束,下次我们讲讲工厂方法模式的下一步升级:抽象工厂模式


相关文章
|
2月前
|
存储 人工智能 Serverless
大学生们注意了,你的拜年姿势准备好了吗?
来尝试一种全新的“数字人”拜年方式吧。上传个人照片,即可一键创建数字人分身,还可以搭配春节服饰、背景、拜年模板,生成专属的数字人拜年视频,简单无门槛,有心更有新。
|
4月前
|
存储 安全 计算机视觉
参加第十二届中国软件杯比赛感想以及经验
今年我作为参赛选手参加了中国软件杯南京线下赛,参加了总决赛答辩环节,下面总结一些参加比赛的经验以及感受
|
5天前
|
弹性计算 小程序 数据安全/隐私保护
大咖与小白的日常:10分钟部署一个年会抽奖程序
本教程指导您3分钟部署一个年会抽奖程序,大屏幕滚动起来吧!
大咖与小白的日常:10分钟部署一个年会抽奖程序
|
物联网 开发者 iOS开发
618程序员如何“狂欢”,来夏令营游学,开发者学堂送iPhone13、千元猫超卡
618组团夏令营活动,不仅可以在四个学习馆系统学习,还可以邀请好友组团一起游园逛馆,还有惊喜大礼iPhone 13 和千元天猫超市卡等你来拿哟~
1585 12
618程序员如何“狂欢”,来夏令营游学,开发者学堂送iPhone13、千元猫超卡
|
存储 人工智能 分布式计算
想当程序员吗?这11所大学计算机专业堪称国内顶级,高考考生千万不要错过
为大家盘点一下目前国内计算机专业比较好的大学。
239 1
这个阿里小二,据说全世界姑娘都羡慕她的工作
大家好,我是好奇橙。我的老板说,好奇心是人类进步的动力。所以……我决定每天进步一点点。阿里是个有趣的地方,有一群神奇的小伙伴,他们的工作奇奇怪怪、五花八门……作为一只好奇的橙子,他们都应该成为我的好朋友。今天就给大家介绍一个小姐姐,她的工作让所有姑娘们都羡慕。
307 0
这个阿里小二,据说全世界姑娘都羡慕她的工作
|
人工智能 达摩院 安全
天津智慧物联赛道明星结营丨创业不孤独,有朋友,有导师,有资源,有未来
4月15日至4月17日,天津智慧物联赛道明星在天津市津南区进行第三次集结。这次集结邀请到主办方代表、津南区智慧城市和物联网相关优质企业及各机构代表、阿里云加速器负责人等,为学员进行全方位的资源对接。另外还有多位行业导师、技术专家现场分享,就智慧物联行业的发展与趋势为学员进行现场答疑,继续陪伴学员成长加速。
天津智慧物联赛道明星结营丨创业不孤独,有朋友,有导师,有资源,有未来
|
Java 双11
“身兼数职”,稳扎稳打,两年资深云大使月入上万经验分享!
身兼数职,稳扎稳打,两年资深云大使月入上万经验分享!
6077 0
“身兼数职”,稳扎稳打,两年资深云大使月入上万经验分享!
叮!阿里巴巴2020届毕业生笔试攻略来了,请查收!
工程师的世界,不止代码,还应该有对未来的洞察与从容。2020届毕业生笔试攻略来了,请查收~