GOF23之工厂模式

一、核心作用:

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

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

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

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

在这里插入图片描述

优点:用来生产不同产品族的全部产品,有利于产品一致性,降低了模块见的耦合性,提高了团队效率
缺点:对于增加新产品无能为力

发布了3 篇原创文章 · 获赞 1 · 访问量 74

猜你喜欢

转载自blog.csdn.net/weixin_44789225/article/details/104429148