设计模式-创建型模式

基础
组合:多种类对象组成新对象。
聚合:多个同种类对象聚起来形成新对象。

UML类图:
虚线三角形:类实现接口
实线三角形:继承
实线空心菱形:依赖,组合
实线实心菱形:依赖,聚合

设计原则
开闭原则:对拓展开发,对修改关闭。如果要修改原有功能或拓展功能,尽量拓展原有代码,而不是修改原有代码。

里氏替换原则:
子类可以扩展父类功能,但不要修改父类原有功能。

依赖转置原则:
面向接口编程,而不是面向实现。

单一职责原则:
一个对象专注一件事。

接口隔离原则:
一个接口只包含用户关心的内容,不要让其内容太庞大。

迪米特原则:
两个软件实体尽量不要直接通信,而是找第三方进行转发,如MQ

合成复用原则:
在“组合/聚合”和“继承”之间抉择时,优先选择“组合/聚合”

设计模式分类
创建型模式:用于创建对象的设计模式。
包含:单例模式、原型模式、工厂模式、建造者模式。

结构型模式:组织对象间的结构,使其易于拓展。
包括:单例模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式、组合模式。

行为模式:决定对象如何做出行为。
包括:模板方法模式、策略模式、命令模式、责任链、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式。

单例模式:
整个应用程序只需要一个实例
方案:禁止用户new该对象,私有化构造函数。只能通过提供的静态方法来获取该对象。静态方法返回的都是同一实例。
懒汉:第一次使用初始化
存在问题1:内存泄漏
解决1:智能指针
解决2:使用静态的嵌套对象
存在问题2:线程安全问题
解决:线程同步,加lock

public static synchronized LazySingleton getInstance() {
//getInstance 方法前加同步
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}

饿汉:程序开始时初始化
private static final HungrySingleton instance = new HungrySingleton();
public static HungrySingleton getInstance() {
return instance;
}

工厂模式

简单工厂模式

模式名称:通过工厂来生产对象,而不是手动new。
问题:通过工厂类,提出传递参数,然后工厂类new相应的对象,返回。

解决方案:定义一个抽象对象(如动物),然后定义一个工厂类,工厂类封装了生产具体动物(当然这些具体动物要继承动物类)的方法。然后你通过参数传递给工厂类,比如要一只汪汪叫的动物,然后工厂方法就会return new Dog()。

效果:用户不必关心对象怎么生产的,甚至不用关心这个具体对象是什么。工厂的生产规则可以写入配置文件,这样修改时就不需要动代码了。

工厂方法模式

简单工厂有一个缺点:如果我们想让工厂再能多生产一种东西,那就要修改这个工厂类的方法。这显然不符合开闭原则。

针对这个问题,所以引出了工厂方法模式。

在简单工厂模式中,不管生产什么品牌的鞋子,都用同一工厂。

而在工厂方法模式中,想要生产某一个品牌的鞋子,就使用其对应的工厂。也就是说一个工厂只生产一种产品,如果你想要的三种不同的产品,你就要有三个工厂。比如,耐克工厂专门生产耐克鞋,阿迪工厂专门生产阿迪鞋。当你后期想要扩展的时候,你就可以再来一个安踏工厂专门生产安踏鞋。

抽象工厂模式

在工厂方法模式中,存在一个缺点,一个工厂只能生产一种产品。如耐克工厂只能生产耐克鞋。但是如果我想让耐克工厂即能生产耐克鞋也可以生产耐克衣服就没办法了。

所以为了解决这个问题,就引出了抽象工厂。在抽象工厂类中定义多个产品,即定义它的子类应该生产哪些产品。 这样就可以做到,耐克厂可以生产耐克鞋和耐克衣服,阿迪工厂可以生产阿迪鞋和阿迪衣服。

但是很明显有一个缺点:如果抽象工厂再加一种产品,比如帽子,那么所有的具体工厂类都要改造。

简单工厂、工厂方法和抽象工厂三者区别
简单工厂:所有的产品都由一个工厂生产。如果你想加产品,就改源代码。
工厂方法:有多个工厂,但一个工厂只生产一种产品。如耐克厂只生产耐克鞋,阿迪厂只生产阿迪鞋。如果你想加产品,那就加工厂类。
抽象工厂:有多个工厂,每个工厂可以生产多类产品。如耐克厂可以生产耐克鞋和耐克衣服,阿迪厂可以生产阿迪鞋和阿迪衣服。但如果你想生产帽子,那么就需要在抽象工厂里加抽象方法,然后修改所有的子类。

建造者模式(Builder)
模式名称:用户就是建造者,自己动手造自己想要的东西。
解决方案:可以将每个部件的构造过程都封装成方法,提供给用户,用户选完自己的部件后,调用build()方法构建出他想要的对象。
Computer computer=new Computer.Builder(“因特尔”,“三星”)
.setDisplay(“三星24寸”)
.setKeyboard(“罗技”)
.setUsbCount(2)
.build();
效果:用户可以定制化自己的产品。避免臃肿的构造方法。
结构型模式
。。。
行为型模式
。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值