设计模式之美:Factory Method(工厂方法)

简介:

索引

别名

  • 虚构造器 (Virtual Constructor)

意图

定义一个用于创建目标对象的接口,让子类决定实例化哪一个目标类。

Factory Method 使一个类的实例化延迟到其子类。

Define an interface for creating an object, but let subclasses decide which class to instantiate.

Factory Method lets a class defer instantiation to subclasses.

结构

参与者

Product

  • 定义工厂方法所创建的对象的接口(Interface)。

ConcreteProduct

  • 实现 Product 接口。

Creator

  • 声明工厂方法,该方法返回一个 Product 类型的对象。 Creator 也可以定义一个工厂方法的缺省实现,它返回一个缺省的 ConcreteProduct 对象。
  • 可以调用工厂方法以创建一个 Product 对象。

ConcreteCreator

  • 重定义(Override)工厂方法以创建一个 Product 对象。

适用性

在下列情况下可以使用 Factory Method 模式:

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

缺点

  • 客户可能仅仅为了创建一个特定的 ConcreteProduct 对象,就不得不创建 Creator 的子类。

效果

  • 为子类提供挂钩
  • 连接平行的类层次

相关模式

  • Abstract Factory 经常用工厂方法来实现。
  • Factory Method 通常在 Template Method 中被调用。
  • Prototype 不需要创建 Creator 的子类。但是,它们通常要求一个针对 Product 类的 Initialize 操作。Creator 使用 Initialize 来初始化对象,而 Factory Method 不需要这样的操作。

命名约定

使用命名约定是一个好习惯,它可以清楚地说明你正在使用工厂方法。(Convention over Configuration)

例如,总是声明那些定义为工厂方法的抽象操作为 CreateProduct()。

实现

实现方式(一):Creator 类是一个抽象类并且不提供它所声明的工厂方法的实现。

需要子类来定义实现,因为没有合理的缺省实现。它避免了不得不实例化不可预见类的问题。

复制代码
 1 namespace FactoryMethodPattern.Implementation1
 2 {
 3   public abstract class AbstractOrInterfaceOfCreator
 4   {
 5     public abstract AbstractOrInterfaceOfProduct CreateProduct();
 6   }
 7 
 8   public abstract class AbstractOrInterfaceOfProduct
 9   {
10   }
11 
12   public class ConcreteCreator : AbstractOrInterfaceOfCreator
13   {
14     public override AbstractOrInterfaceOfProduct CreateProduct()
15     {
16       return new ConcreteProduct();
17     }
18   }
19 
20   public class ConcreteProduct : AbstractOrInterfaceOfProduct
21   {
22   }
23 
24   public partial class Test
25   {
26     public void Case1()
27     {
28       AbstractOrInterfaceOfCreator creator = new ConcreteCreator();
29       AbstractOrInterfaceOfProduct product = creator.CreateProduct();
30     }
31   }
32 }
复制代码

实现方式(二):Creator 类是一个具体类而且为工厂方法提供一个缺省的实现。

具体的 Creator 主要因为灵活性才使用工厂方法。它所遵循的准则是,“用一个独立的操作创建对象,这样子类才能重定义它们的创建方法”。这条准则保证了子类的设计者能够在必要的时候改变父类所实例化的对象的类。

复制代码
 1 namespace FactoryMethodPattern.Implementation2
 2 {
 3   public class ConcreteCreator
 4   {
 5     public virtual AbstractOrInterfaceOfProduct CreateProduct()
 6     {
 7       return new ConcreteProduct();
 8     }
 9   }
10 
11   public abstract class AbstractOrInterfaceOfProduct
12   {
13   }
14 
15   public class ConcreteProduct : AbstractOrInterfaceOfProduct
16   {
17   }
18 
19   public partial class Test
20   {
21     public void Case2()
22     {
23       ConcreteCreator creator = new ConcreteCreator();
24       AbstractOrInterfaceOfProduct product = creator.CreateProduct();
25     }
26   }
27 }
复制代码

实现方式(三):参数化工厂方法。

使用参数化工厂方法可以创建多种产品。工厂方法采用一个标识要被创建的对象种类的参数。

复制代码
 1 namespace FactoryMethodPattern.Implementation3
 2 {
 3   public enum ProductCategory
 4   {
 5     GoodProduct,
 6     BadProduct,
 7   }
 8 
 9   public class ConcreteCreator
10   {
11     public virtual AbstractOrInterfaceOfProduct CreateProduct(ProductCategory category)
12     {
13       switch (category)
14       {
15         case ProductCategory.GoodProduct:
16           return new ConcreteGoodProduct();
17         case ProductCategory.BadProduct:
18           return new ConcreteBadProduct();
19         default:
20           throw new NotSupportedException();
21       }
22     }
23   }
24 
25   public abstract class AbstractOrInterfaceOfProduct
26   {
27   }
28 
29   public class ConcreteGoodProduct : AbstractOrInterfaceOfProduct
30   {
31   }
32 
33   public class ConcreteBadProduct : AbstractOrInterfaceOfProduct
34   {
35   }
36 
37   public partial class Test
38   {
39     public void Case3()
40     {
41       ConcreteCreator creator = new ConcreteCreator();
42       AbstractOrInterfaceOfProduct product = creator.CreateProduct(ProductCategory.GoodProduct);
43     }
44   }
45 }
复制代码

实现方式(四):使用模板以避免创建子类。

使用C#中的泛型实现工厂方法。

复制代码
 1 namespace FactoryMethodPattern.Implementation4
 2 {
 3   public abstract class AbstractOrInterfaceOfCreator
 4   {
 5     public abstract AbstractOrInterfaceOfProduct CreateProduct();
 6   }
 7 
 8   public class GenericConcreteCreator<T> : AbstractOrInterfaceOfCreator
 9     where T : AbstractOrInterfaceOfProduct, new()
10   {
11     public AbstractOrInterfaceOfProduct CreateProduct()
12     {
13       return new T();
14     }
15   }
16 
17   public abstract class AbstractOrInterfaceOfProduct
18   {
19   }
20 
21   public class ConcreteGoodProduct : AbstractOrInterfaceOfProduct
22   {
23   }
24 
25   public class ConcreteBadProduct : AbstractOrInterfaceOfProduct
26   {
27   }
28 
29   public partial class Test
30   {
31     public void Case3()
32     {
33       AbstractOrInterfaceOfCreator creator1 = new GenericConcreteCreator<ConcreteGoodProduct>();
34       AbstractOrInterfaceOfCreator creator2 = new GenericConcreteCreator<ConcreteBadProduct>();
35       AbstractOrInterfaceOfProduct product1 = creator1.CreateProduct();
36       AbstractOrInterfaceOfProduct product2 = creator2.CreateProduct();
37     }
38   }
39 }
复制代码
目录
相关文章
|
2月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
4月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
8月前
|
设计模式 Java 容器
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
|
4月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
5月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
5月前
|
设计模式 uml
设计模式-------------工厂模式之工厂方法模式(创建型)
工厂方法模式是一种创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现类的实例化推迟到子类中进行,提高了系统的灵活性和可扩展性。
|
7月前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
7月前
|
设计模式 搜索推荐
工厂方法模式-大话设计模式
工厂方法模式-大话设计模式
|
7月前
|
设计模式 新零售 Java
设计模式最佳套路5 —— 愉快地使用工厂方法模式
工厂模式一般配合策略模式一起使用,当系统中有多种产品(策略),且每种产品有多个实例时,此时适合使用工厂模式:每种产品对应的工厂提供该产品不同实例的创建功能,从而避免调用方和产品创建逻辑的耦合,完美符合迪米特法则(最少知道原则)。
95 6
|
7月前
|
设计模式 XML Java
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
三 结尾 如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持! 如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号
70 5