设计原则
开放封闭原则(Open-Closed Principle):对扩展开放,对修改关闭。也就说程序设计完成,之后想要扩展不需要改动原程序。
依赖倒置原则(Dependence Inversion Principle):要依赖于抽象,不要依赖于具体
降低耦合度,把业务逻辑和界面逻辑分开,说到底是为了便于扩展。
面向对象的三大特性:封装、继承、多态。
简单工厂模式:
简单工厂模式是属于创建型模式,又叫做静态工厂方法,由一个工厂对象决定创建出哪一种产品类的实例。
包含一个抽象类,多种继承该类的派生类;包含一个工厂类,工厂类返回一个抽象类的指针,根据传入工厂类的参数来选择是传回指向哪个派生类对象的指针。
举例:要买洗发水,洗发水有去屑型、柔顺型、滋养型等等。
于是,我们写了一个抽象类洗发水,然后去屑型、柔顺型、滋养型都继承于洗发水类,然后再写一个工厂类,工厂类有函数creatShampoo(int type)返回一个洗发水指针。当type表示去屑时,返回一个指向去屑型对象的指针,当type表示柔顺时,返回一个指向柔顺型对象的指针,当type表示滋养时,返回一个指向滋养型对象的指针,其中函数内根据type来判断应该返回哪个对象的指针,会有一个switch语句。
缺点
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
这些缺点在工厂方法模式中得到了一定的克服。
使用场景
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
工厂方法模式:
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
举例:洗发水类同简单工厂,用于create的工厂类则进行变化,核心工厂类不负责产品的创建,而是作为一个抽象工厂角色,每一种类型的洗发水对应一个新的工厂类,如去屑洗发水工厂、柔顺洗发水工厂、滋养洗发水工厂。也就是说每个具体工厂对应一种具体洗发水。这样子,如果新增加夏日清凉洗发水的时候,就能够直接扩展,不需要修改工厂类,符合OCP。
克服了简单工厂违背开放-封闭原则(OCP),又保持了封装对象的优点,
抽象工厂方法:
举例:此时不仅仅是洗发水,还要多一种产品沐浴露,同时沐浴露也有去屑型(理解乘去死皮好了,将就将就o(╯□╰)o)、柔顺型、滋养型,也就是多了一种产品,该产品下的划分依然相同。
用简单工厂完善抽象工厂:用一个工厂类的工厂来创建工厂。