一、核心作用:
实现了创建者和调用者分离
二、面向对象的基本原则:
1、OCP开闭原则(open-closed principle):一个软件的实体应当对扩展开放,对修改关闭。
2、DIP依赖倒转原则(Dependence Inversion principle):要针对接口编程,不要针对实现编程
3、Lod迪米特法则(Low of Demeter/Demeter Principle):只与直接朋友通信,避免和陌生人通信
4、ISP接口隔离原则(Interface Segregation Principle):使用多个隔离的接口,比单个接口要好,降低依赖,降低耦合
5、CRP合成复用原则(Composite Reuse Principle):尽可能使用合成/聚合的方式,而不是使用进程
6、LSP里氏代换原则(Liskov Substitution Principle):任何基类可以出现的地方,子类一定可以出现LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正的被复用,而衍生类也能再基类的基础上加新的行为。里氏代换原则是对”开闭原则“的补充
三、优点:
1、实例化对象,用工厂方法代替new操作
2、将选择实现类、创建对象统一管理和控制,实现调用者与实现类解耦
四、工厂模式实现方式:
简单工厂模式:用来生产同一等级结构的任意产品(增加新产品需修改原代码)
工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
抽象工厂模式:用来生产不同产品族的全部产品(对于增加新的产品,无能为力)
一、简单工厂(SimpleFactory)
package com.hezeu.factory.simplefactory;
/**
*@Classname CarFactory
*@Description 工厂实现new
*@Date 2020/2/20 下午 04:41
*@Created by 朱进博 1724282894@qq.com
*/
public class CarFactory{
public static CarcreateAudi(){
return new Audi();
}
public static CarcreateByd(){
return new Byd();
}
}
package com.hezeu.factory.simplefactory;
/**
*@Classname CarFactory02
*@Description TODO
*@Date 2020/2/20 下午 04:42
*@Created by 朱进博 1724282894@qq.com
*/
public class CarFactory02{
public static CarcreateCar(Stringtype){
if(type.equals("奥迪")){
return new Audi();
}else if(type.equals("比亚迪")){
return new Byd();
}else{
return null;
}
}
}
优点:简单工厂模式也叫静态工厂模式,工厂类使用静态方法,通过接受参数返回不同的对象实例
问题:对于增加新产品无能威力,需要修改代码,无法满足OCP开闭原则
二、工厂方法模式(FactoryMethod)
工厂类:
packagecom.hezeu.factory.factorymethod;
/**
*@Classname AudiFactory
*@Description TODO
*@Date 2020/2/20 下午 05:14
*@Created by 朱进博 1724282894@qq.com
*/
public class AudiFactory implements CarFactory{
@Override
public Car createCar(){
return new Audi();
}
}
测试类:
package com.hezeu.factory.factorymethod;
/**
*@Classname Client
*@Description TODO
*@Date 2020/2/20 下午05:16
*@Created by 朱进博 1724282894@qq.com
*/
public class Client{
public static void main(String[]args){
Car c1 = new AudiFactory().createCar();
Car c2 = new BydFactory().createCar();
c1.run();
c2.run();
}
}
优点:解决了简单工厂模式中的缺点,满足OCP开闭原则
缺点:需要创建多个类文件,结构复杂、管理复杂
简单工厂模式与工厂方法模式对比:
结构复杂度对比:
简单工厂模式:只需创建一个工厂类
工厂方法模式:工厂类随着产品类的个数增加
代码复杂度对比:
简单工厂模式:因只有一个工厂类,虽结构简洁,但代码复杂
工厂方法模式:每个具体工厂类只完成单一任务,代码简洁
客户端编程难度对比:
简单工厂模式:工厂类为静态类,只需调用方法,无需实例化对象
工厂方法模式:虽满足了OCP开闭原则,但客户端编程需要对工厂类逐一实例化
管理难度对比:
简单工厂模式:未满足OCP开闭原则,但如果产品类需要修改时,仅需修改唯一的工具类,管理简单。
工厂方法模式:工厂方法模式满足OCP,扩展性较强,但如果设计多个产品类的时候,对于工厂类的修改将会非常麻烦,管理复杂。
三、抽象工厂模式(产品族管理)
优点:用来生产不同产品族的全部产品,有利于产品一致性,降低了模块见的耦合性,提高了团队效率
缺点:对于增加新产品无能为力