GOF:工厂模式是一种对象创建型模式,它把类的实例的创建延迟到子类中完成,父工厂类只定义创建对象的公共接口,而子工厂类则负责生成具体的类的实例。
工厂方法是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到Factory Method 模式了.简单说来,Factory Method可以根据不同的条件产生不同的实例,当然这些不同的实例通常是属于相同的类型,具有共同的父类.Factory Method把创建这些实例的具体过程封装起来了,简化了客户端的应用,也改善了程序的扩展性,使得将来可以做最小的改动就可以加入新的待创建的类. 通常我们将Factory Method作为一种标准的创建对象的方法,当发现需要更多的灵活性的时候,就开始考虑向其它创建型模式转化.
工厂方法的一个典型例子:迭代器
迭代器模式提供了一种顺序访问集合中的元素的方法,然而通常用iterator()方法本身却是一个工厂方法模式的很好的例子,该方法使得调用方无需了解所要实例化的类,JDK引入了collection()接口,该接口包含了一个iterator()方法,所有的集合都要实现该接口,通过集合创建了一个对象,该对象返回集合中的各个元素的序列,例如,下面的代码创建了一个列表对象,并将他的元素打印出来.
public class ShowIterator{
public static void mian(String args[]){
List list=Array.asList(new String[]{"foundation","rocket","sparkler"});
Iterator i=list.iterator();
while(i.hasNext()){
System.out.prinltn(i.next());
}
}
}
在工厂方法模式中,工厂方法的用户不必知道该实例化那个类,上面的iterator()方法很好的示范了这个特性.
呵呵上面那个例子可能太抽象了,下面结合书上的祥细的例子讲解了.
日志记录是软件开发中常用的功能之一,我们有时候需要日志向打到控制台,有时侯打到文件了,因此将实际的日志的记录功能保留在公共的程序内部是一个很好的想法了,这样客户机对象就无需重复这些详细信息.定义一个JAVA接口Logger,声明该接口有客户机对象用于记录消息,一般来说.进来的消息可以按不同的格式记录到不同的输出的介质上,因为Logger接口的不同具体实现者类可以在实施中处理这些差异,定义这两个实施者.Logger接口代码如下:
public interface Logger {
public void log(String msg);
}
Logger实施者代码如下:
public class ConsoleLogger implements Logger {
@Override
public void log(String msg) {
// TODO Auto-generated method stub
System.out.println(msg);
}
}
public class FileLogger implements Logger {
@Override
public void log(String msg) {
// TODO Auto-generated method stub
File futil=new FileUtil();
futil.writeToFile("log.txt",msg,true,true);
}
}
应用工厂方法模式,选择相应的Logger实施者所需的实施可以封装在单独类LoggerFactory中的单独方法getLogger工厂方法的内部.
作为工厂方法实施的一部分,工厂方法法getLogger会检查logger.properties属性文件以查看是否启用文件记录的功能.并决定要选定那个Logger实施者将作为Logger类型的对象返回.
使用工厂方法,客户机对象无需处理选择和例示相应的Logger实施者出现的复杂状况.也无需了解Logger接口的不同实施者的存在性及相关功能.LoggerFactory代码如下:
import java.io.IOException;
import java.util.Properties;
public class LoggerFactory {
public boolean isFileLoggingEnabled(){
Properties p=new Properties();
try{
p.load(ClassLoader.getSystemResourceAsStream("Logger.properties"));
String fileLoggingValue=p.getProperty("FileLogging");
if(fileLoggingValue.equalsIgnoreCase("ON")==true)
return true;
else
return false;
}catch (IOException e){
return false;
}
}
//Factory Method
public Logger getLogger(){
if(isFileLoggingEnabled()){
return new FileLogger();
}else {
return new ConsoleLogger();
}
}
}
客户机LoggerTest代码如下:
public class LoggerTest {
public static void main(String args[]){
LoggerFactory factory=new LoggerFactory();
Logger logger=factory.getLogger();
logger.log("A Message to Log");
}
}
在本应用中,我们使用工厂方法的默认实施将创建者类LoggerFactory设计为具体的类。我的感受是在工厂类中完成客户机的类选择功能,这样让客户机不用知道自己去选择那个类,我觉的这也是接口的一个用法!
分享到:
相关推荐
工厂方法模式是面向对象设计模式中的行为型模式之一,它提供了一种...在提供的文件列表中,“FactoryMethod”可能是包含这个简单示例代码的文件。如果有机会查看这个文件,将能更深入地理解工厂方法模式的实现细节。
在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...
1. 抽象工厂(Abstract Factory):这是工厂方法模式的核心接口,它声明了一组用于创建产品的公共方法。抽象工厂通常为抽象类或接口。 2. 具体工厂(Concrete Factory):实现了抽象工厂接口,提供具体的产品实例。...
今天我们要探讨的是设计模式中的一个经典成员——工厂方法模式(Factory Method Pattern)。工厂方法模式是创建型设计模式的一种,它提供了一种创建对象的最佳方式。 ### 一、什么是工厂方法模式? 工厂方法模式...
《设计模式之——工厂方法(Factory Method)》 在软件工程中,设计模式是一种解决常见问题的可重用解决方案,它被广泛应用于构建高质量、可维护的代码。工厂方法是面向对象设计模式的一种,属于创建型模式。这个...
C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)
### Factory Method 工厂方法模式(创建型模式) #### 概述 在软件工程领域,设计模式是一种在特定上下文中解决常见问题的通用方案。Factory Method(工厂方法)模式是GoF(Gang of Four)设计模式之一,属于创建型...
设计模式C++学习之工厂方法模式(Factory Method)
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪一个具体类。这样,客户端代码就不需要知道具体的类是什么,只需通过工厂接口获取对象。 工厂...
工厂方法(Factory Method)是面向对象设计模式中的一个基础且广泛应用的模式,它属于创建型模式,主要目的是为了解耦对象的创建过程。本文将深入探讨工厂方法的设计理念、实现方式及其在实际开发中的应用。 ### ...
Factory Method 工厂方法模式(创建型模式).wmv
它们都是由不同的厂家生产的,这就是工厂方法模式(FactoryMethod)与前面所说的简单工厂模式(SimpleFactory)的差别。 实例: 多文档系统。我已经用C#的源码编程了:请下载Factory Method Patter.rar
工厂方法模式(Factory Method Pattern)是设计模式中的创建型模式之一,主要解决对象创建过程中的复杂性问题。在软件工程中,当一个类不知道它所必须创建的对象的类的时候,它就不会实例化对象,而是使用一个工厂...
C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式) (Level 300)
工厂方法(Factory Method)设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个类的实例化延迟到了子类,这样做的好处是每个子类可以决定实例化哪一个类。这种类型的设计模式...
Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。
C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式) 视频教程,主讲人李建忠