设计模式01——静态工厂模式、工厂方法模式、抽象工厂模式

静态工厂模式

静态工厂模式是由一个工厂对象决定创建出哪一种产品类的实例

优点:

1、应用简单,createProduct方法是静态方法,它负责创建产品类的实例。

缺点

1、当产品存在复杂的、多层次的等级结构时,在什么时候创建哪些产品的实例,完全由工厂类负责,使得工厂方法的逻辑过于复杂,且不利于扩展。

2、工厂方法是静态方法,无法由子类继承。

应用场景:适用于逻辑较为简单的工厂方法。

应用示例:java中的DateFormat类是一个抽象类,它的getDateInstance方法返回的是DateFormat的子类,比如SimpleDateFormat。

 

工厂方法模式

工厂方法模式是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中

优点:

1、弥补了静态工厂模式的不足,为工厂类提供了多态性的可能。

缺点

1、从上图看,产品角色是单一的产品等级结构,如果存在多个产品等级结构(把IProduct复制出IProduct1、IProduct2),工厂方法无法得知它应该创建哪个产品等级(IProduct、IProduct1、IProduct2)的产品子类,此时,工厂方法模式无能为力。

应用场景:适用于单一产品等级结构的场景。

应用示例:java.util.Collection接口的iterator方法,就是一个工厂方法。它要求所有实现了Collection接口的子类,返回一个Iterator类型的对象,而Iterator是一个接口,它定义了一个抽象产品。

 

抽象工厂模式

抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象

优点:

1、弥补了工厂方法模式的不足,可支持多个产品等级结构。

缺点

1、当新增一个产品族(MacFactory)时,在产品等级结构数目不变的情况下,每一个产品等级结构下需要新增一个或多个新的具体产品角色(MacButton、MacText),同时加入新的具体工厂类,不涉及修改现有的工厂角色或产品角色,此时,抽象工厂模式支持开闭原则。当新增一个产品等级结构时,需要修改所有的工厂角色,为每一个工厂类都增加一个新的工厂方法,此时,抽象工厂模式不支持开闭原则。

应用场景:适用于多个产品等级结构的场景。

应用示例:java.awt.Tooltik对应IAbstractFactory,java.awt.peer.ButtonPeer对应IProduct

 

posted on 2021-06-15 00:26  jacky_bear  阅读(213)  评论(0编辑  收藏  举报

导航