设计模式学习-创建型模式总结

前面几天的学习中,学习了常见设计模式中的创建型模式,分为简单工厂模式、工厂方法模式、抽象工厂模式、原型模式、建造者模式、单例模式等。它们具有的共同优点是:创建型模式对于类的实例化过程进行了抽象,将对象的生成过程和对象的实现过程进行了分离,保证了的单一职责原则,调用方调用的时候,只需要知道获得对象的接口,并不要了解复杂的生成过程;同时由于只暴露了对外的接口,内部的实现细节修改起来也比较方便,符合开闭原则。

在实际的的开发过程中,并不能对着设计模式照搬硬套,而应该在设计模式的基础上,根据代码的实际情况,写出适合的代码结构,我们最终的目的是实现面向对象设计六大原则,保证项目的可用性、易读性、扩展性等,而设计模式只是我们达到这一个目标的辅助手段。

下面是对前面学习的创建型模式做了一个总结。

模式名称 模式构成 优点 缺点
简单工厂模式 Factory
Product
ConcreteProduct
1.结构简单,易读;
2.客户端只要传入相应的参数就可以获取对象,不用了解细节,可以通过配置文件来执行,提高了灵活性
1.工厂类中集合了所有产品对象创建的过程和判断过程,职责重,代码复杂;
2.新增产品需要修改工厂列,不符合开闭原则,不利于扩展和维护
工厂方法模式 Product
ConcreteProduct
Factory
ConcreteFactory
1.继承了简单工厂模式的优点
2.根据多态性设计,对于新增的产品,只需要创建对应的产品实现类和产品工厂类,不需要对原来的代码进行修改
1.每增加一个产品实现类,就要编写一个对应的产品工厂类,对于比较多的产品,代码量比较大,系统复杂度高
抽象工厂模式 AbstractFactory
ConcreteFactory
AbstractProductA
ConcreteProductA
AbstractProductB
ConcreteProducbB
1.抽象工厂类在某些方面继承了工厂方法的优点,并对它进行了优化,比如增加新的产品族时,只要增加一个新的工厂和具体的产品类就可以,在产品比较多的情况下,减少了类的数量,一定程度上保证了开闭原则
2.对于同一个产品族多个对象在一起工作的时候,能够保证多个对象都属于同一个产品族
只是增加产品族比较方便,但如果产品等级结构发生了变化,那么要对每个产品工厂进行修改,工作量大,违背了开闭原则
建造者模式 Builder
ConcreteBuilder
Product
Direcotr
1.调用方不需要知道产品生成的详细过程,将产品生成和使用分离,实现了解耦
2.建造者相互独立,调用方替换产品只需要修改相应的建造者
3.更加精细的控制产品的生成过程,代码可读性高
1.并不是所有产品都适合建造者模式,只有比较相近的且结构复杂的产品才适合建造者模式
2.如果产品内部变化复杂,可能需要很多的建造者类,代码量大,系统复杂
       
单例模式 深克隆、浅克隆 1.当创建比较复杂的对象的时候,原型模式可以简化生成过程,提高创建对象的速度
2.不需要专门的工厂类,方法写在类内部,减少了代码的复杂度
3.可以完全复制当前对象的所有状态
1.需要为每个类编写自己的clone方法,代码量大
2.当类内容发生了变化,需要修改clone方法,不符合开闭原则
3.复杂的类要完成其clone方法,实现比较复杂
原型模式 饿汉式、双重检查锁定、IoDH 1.单例模式类中封装了唯一实例,严格控制了用户怎样访问它
2.由于系统内存中只存在了一个对象,节省了系统资源,相对于一些频繁创建和销毁的对象,明显提高了性能
3.基于单例模式可以变幻出控制对象数目的类
职责重,既有业务方法,又有创建方法,违背了单一职责原则

你可能感兴趣的:(java设计模式)