0.前言
本文主要面向初学者,网上这方面的文章也很多,之所以还写这个,一方面是给有需要的人,另一方面是巩固自己的知识,写写记得更牢嘛,也为去找实习找工作打点基础。这主要是从我的角度去理解工厂方法,肯定有很多不够好的地方,如果大牛们不吝啬,欢迎批评指正。
1.正文
工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化的延迟到其子类。
考虑这样一个小例子,可能不太靠谱,凑合着用吧。
你是做手机代工的,你可以做iphone的手机,也可以做android的手机等,需求是变的,这个不确定。做不同的手机用到的配件等是不一样的,但最后的手机质量检测程序是一样的,那该怎么办呢?
这时候工厂方法给你提供了一个解决方案,首先把你的工厂定义为一个抽象的类,有一个抽象方法专门负责生产手机,然后让子类来负责生产相应的手机,最后手机的质量检测由你来执行。这样你就不用关心是生产哪种手机和怎样生产的,你知道只要继承了你的工厂,给你返回手机就行了,让手机的生产给子类去做。类似的,生产的产品也是一样的,对不同的产品,可以定义一个抽象的类,让不同的产品也继承这个抽象的产品。这就是工厂方法。
UML图
这里定义了两个抽象类,Product和Creator,Creator的子类ConcreteCreator重定义了抽象操作,负责具体的创建工作。根据创建的产品的不同,可以有多个具体的产品和多个具体的工厂,只需要继承相应的类就行,两个抽象类无需改变。
适用性:
当一个类不知道它所必须创建的对象的类的时候;
当一个类希望由它的子类来指定它所创建的对象的时候
上面例子简单实现的代码
一个5个类,抽象产品Product和抽象工厂Creator在同一包中,具体产品类IphoneProduct和具体工厂类IphoneCreator分别继承Product、Creator,跟抽象类属于不同包,IphoneCreator负责具体产品Iphone的生产。Client属于测试类。
抽象产品类Product
package com.rdc.dp.frameword;
public abstract class Product {
//这里只定义一个简单方法
public abstract void use();
}
抽象工厂类Creator
package com.rdc.dp.frameword;
public abstract class Creator {
public final Product newProduct() {
Product product = createProduct();
check(product);
return product;
}
//手机检测
private Product check(Product product) {
//do something
return product;
}
//子类实现此方法,负责具体产品的创建
protected abstract Product createProduct();
}
newProduct()方法供客户端调用,负责手机生产和手机质量检测,而手机生产的方法为抽象方法createProduct(), 是由具体子类去实现的。
具体产品类IphoneProduct
package com.rdc.dp;
import com.rdc.dp.frameword.Product;
public class IphoneProduct extends Product {
@Override
public void use() {
System.out.println("Iphone生产出来啦,这是你的Iphone.");
}
}
具体工厂类,负责生产Iphone,IphoneCreator
package com.rdc.dp;
import com.rdc.dp.frameword.Creator;
import com.rdc.dp.frameword.Product;
public class IphoneCreator extends Creator{
/**
*生成Iphone的工厂,负责产品的具体创建
*/
@Override
protected Product createProduct() {
return new IphoneProduct();
}
}
测试类Client
import com.rdc.dp.IphoneCreator;
import com.rdc.dp.frameword.Creator;
import com.rdc.dp.frameword.Product;
public class Client {
public static void main(String[] args) {
//建一个Iphone工厂
Creator creator = new IphoneCreator();
//产品由具体类生产
Product product = creator.newProduct();
product.use();
}
}
测试结果:Iphone生产出来啦,这是你的Iphone.
这样,我们就实现了一个简单的工厂方法。我们可以看到,在客户程序中,可以有效地避免了具体产品对象和应用程序之间的耦合。另外,当你要生产其它的产品时,比如android手机,只需用定义相应的android产品和生产android产品的工厂类,而两个抽象类不需要做任何修改。
- 描述: 工厂方法
- 大小: 88.7 KB
分享到:
相关推荐
《设计模式之——工厂方法(Factory Method)》 在软件工程中,设计模式是一种解决常见问题的可重用解决方案,它被广泛应用于构建高质量、可维护的代码。工厂方法是面向对象设计模式的一种,属于创建型模式。这个...
工厂方法模式是面向对象设计模式中的行为型模式之一,它提供了一种...在提供的文件列表中,“FactoryMethod”可能是包含这个简单示例代码的文件。如果有机会查看这个文件,将能更深入地理解工厂方法模式的实现细节。
在众多设计模式中,“工厂方法模式”(Factory Method Pattern)尤为突出,它是一种创建型设计模式,用于解决在类的实例化过程中,如何避免硬编码的问题,同时保持系统的灵活性与可扩展性。 #### 工厂方法模式的...
在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...
今天我们要探讨的是设计模式中的一个经典成员——工厂方法模式(Factory Method Pattern)。工厂方法模式是创建型设计模式的一种,它提供了一种创建对象的最佳方式。 ### 一、什么是工厂方法模式? 工厂方法模式...
1. 抽象工厂(Abstract Factory):这是工厂方法模式的核心接口,它声明了一组用于创建产品的公共方法。抽象工厂通常为抽象类或接口。 2. 具体工厂(Concrete Factory):实现了抽象工厂接口,提供具体的产品实例。...
### Factory Method 工厂方法模式(创建型模式) #### 概述 在软件工程领域,设计模式是一种在特定上下文中解决常见问题的通用方案。Factory Method(工厂方法)模式是GoF(Gang of Four)设计模式之一,属于创建型...
C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)
在提供的压缩包文件“design-pattern-factory-method-master”中,我们可以期待找到一个Java项目,其中包含了上述各个角色的实现,通过代码示例来详细展示工厂方法模式的用法。这将帮助开发者更好地理解如何在实际...
设计模式C++学习之工厂方法模式(Factory Method)
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪一个具体类。这样,客户端代码就不需要知道具体的类是什么,只需通过工厂接口获取对象。 工厂...
在这个“cs代码-FactoryMethod”的压缩包中,我们可以期待找到一个使用C#(cs)语言实现的工厂方法模式示例。下面我们将深入探讨工厂方法的设计理念、工作原理以及如何在C#中应用。 ### 工厂方法设计模式概述 工厂...
C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式) (Level 300)
在实际应用中,`05.Win32ConApp_FactoryMethod-03`可能是项目中的一个源文件或示例代码,它可能包含了如何在Windows 32位环境下实现工厂方法的具体步骤和示例。这可能包括如何创建和使用这些类,以及如何在命令行...
**工厂方法设计模式** 工厂方法设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,当我们创建对象时,我们不直接实例化对象,而是调用一个工厂方法来创建对象。这种模式的关键在于...
在这个"factory-method-demo.zip"压缩包中,我们可能找到了一个关于工厂方法模式的实际应用示例。 工厂方法模式的核心思想是定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类...