一、核心作用:

实现了创建者和调用者分离

二、面向对象的基本原则:

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)

GOF23之工厂模式_设计模式

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)

GOF23之工厂模式_java_02

工厂类:

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,扩展性较强,但如果设计多个产品类的时候,对于工厂类的修改将会非常麻烦,管理复杂。

三、抽象工厂模式(产品族管理)

GOF23之工厂模式_工厂方法模式_03

优点:用来生产不同产品族的全部产品,有利于产品一致性,降低了模块见的耦合性,提高了团队效率

缺点:对于增加新产品无能为力