`
java苹果+番茄
  • 浏览: 67983 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

工厂方法(Factory Method)模式【创建模式第三篇】

阅读更多
工厂方法(Factory Method)模式
1、工厂方法模式是类的创建模式,又叫做虚拟构造子模式或者多态性工厂模式
   工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
  
一般而言工厂方法模式的系统设计到以下几种角色:
1) 抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的,
    任何在模式之中个窗对象的工厂类必须实现这个接口,在实际系统中,这个角色也使用抽象类实现
   
2) 具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体java类。
    具体工厂角色含有与用应密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
   
3) 抽象产品角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口,
    在实际应用中,这个角色也常常使用抽象java类实现
   
4) 具体产品角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例
2、举例:
	//抽象工厂(角色)接口
	public interface Creator{
		//工厂方法
		public Product factory();
	}
	
	//抽象产品(角色)接口
	public interface Product{
	
	}				//一个没有声明任何方法的接口叫做标识接口
	
	//具体工厂(角色)类
	public class ConcreteCreator1 implements Creator{
		//工厂方法
		public Product factory(){
			return new ConcreteProduct1();
		}
	}
	
	public class ConcreteCreator2 implements Creator{
		//工厂方法
		public Product factory(){
			return new ConcreteProduct2();
		}
	}
	
	//具体产品(角色)类
	public class ConcreteProduct1 implements Product{
		public ConcreteProduct1(){
			//do somthing
		}
	}
	
	public class ConcreteProduct2 implements Product{
		public ConcreteProduct2(){
			//do somthing
		}
	}
	
	//客户端(角色)类
	public class Client{
		private static Creator creator1,creator2;
		private static Product prod1,prod2;
		
		public static void main(String args[]){
			creator1 = new ConcreteCreator1();
			prod1 = creator1.factory();
			creator2 = new ConcreteCreator2();
			prod2 = creator2.factory();
		}
	}


Client对象的活动可以分为两部分
1) 客户端创建 ConcreteCreator1 对象,这时客户端所持有变量的静态类型是Creator,而实际类型是 ConcreteCreator1,然后,客户端调用 ConcreteCreator1 对象的工厂方法 factory() ,接着后者调用 ConcreteProduct1 的构造子创建出产品对象
2、举例:
		//抽象工厂角色(水果园丁)
		public interface FruitGardener{
			//工厂方法
			public Fruit factory();
		}
		
		//具体工厂类(苹果园丁)
		public class AppleGardener implements FruitGardener{
			public Fruit factory(){
				return new Apple();
			}
		}
		
		//......(草莓园丁)
		public class StrawberryGardener implements FuritGardener{
			public Fruit factory(){
				return new Strawberry();
			}
		}
		
		//......(葡萄园丁)
		public class GrapeGardener implements FuritGardener{
			public Fruit factory(){
				return new Grape();
			}
		}
		
		//抽象产品角色(水果接口)
		public interface Fruit{
			void grow();
			void harvest();
			void plant();
		}
		
		//具体产品角色(苹果类)
		public class Apple implements Fruit{
			private int treeAge;
			
			public void grow(){
				log("Apple is growing...");
			}
			
			public void harvest(){
				log("Apple has been harvested.");
			}
			
			public void plant(){
				log("Apple has been planted.");
			}
			
			public static void log(String msg){
				System.out.println(msg);
			}
			
			public int getTreeAge(){
				return treeAge;
			}
			
			public void setTreeAge(int treeAge){
				this.treeAge = treeAge;
			}
		}
		//其他同上..........................

3、工厂方法返还的类型
工厂返还的应当是抽象类型,而不是具体类型,只有这样才能保证整队产品的多态性,调用该工厂方法的客户端可以针对抽象编程,依赖于一个抽象产品类型,而不是具体产品类型。
在特殊情况下,工厂方法仅仅返还一个具体产品类型,这个时候工厂方法模式的功能就退化了,表现为针对产品角色的多态性的丧失,客户端从工厂方法的静态类型可以知道将要得到的是什么类型的对象,而这违背了工厂方法模式的用意

4、与其他模式的关系

1、模板方法模式
工厂方法模式常常与模板方法模式一起联合使用,其原因有二:
一、两个模式都是基于方法的,工厂方法模式是基于多态性的工厂方法的,而模板方法模式是基于模板方法和基于方法的
二、两个模式的哦将具体工作交给子类,工厂方法模式将创建工作推延给子类,模板方法模式将生于逻辑交给子类

2、MVC模式
工厂方法模式总是设计到两个等级结构中的对象,而这两个等级结构可以分别是MVC模式中的控制器和视图。一个MVC模式可以有多个控制器和多个视图,控制器端可以创建合适的视图断,如同工厂角色创建合适的对象角色一样,模型端则可以充当这个创建过程的客户端

3、亨元模式
使用了带有逻辑的工厂方法

4、备忘录模式
亨元模式使用了一个聚集来等级所创建的产品对象,以便可以通过查询这个聚集找到和共享已经创建了的产品对象,这就是备忘录模式的应用
5、举例:
		问题:某一个商业软件产品需要支持Sybase和Oracle数据库。这个系统需要这样一个查询运行期系统,根据客户需要,可以随时向Sybase和Oracle数据库引擎发出查询
		答案:可以看出,这个系统是由一个客户端Client,一个抽象工厂角色QueryRunner,两个具体工厂角色SybaseQueryRunner和OracleQueryRunner,以及产品角色组成的
		对于客户端Client而言,系统的抽象产品角色是ResultSet接口,而具体产品角色就是java.sql.Connection所返还的具体ResultSet对象,createSql()方法和createConnection()方法实际上也是工厂方法,他们的产品是SQL语句和Connection对象
		//java抽象类QueryRunner
		import java.sql.Connection;
		import java.sql.ResultSet;
		
		public abstract class QueryRunner{
			public ResultSet run() throws Exception{
				Connection conn = createConnection();
				String sql = createSql();
				return runSql(conn,sql);
			}
			protected abstract Connection createConnection();
			protected abstract String createSql();
			protected abstract ResultSet runSql(Connection conn.String sql)throws Exception;
		}
		
		//具体工厂类
		import java.sql.Connection;
		import java.sql.Statement;
		import java.sql.ResultSet;
		
		public class SybaseQueryRunner extends QueryRunner{
			public Connection createConnection(){
				return null;
			}
			
			protected String createSql(){
				return "select * from customers";
			}
			
			protected ResultSet runSql(Connection conn,String sql) throws Exception{
				Statement stmt = conn.createStatement();
				return stmt.executeQuery(sql);
			}
		}
		
		//具体工厂类
		import java.sql.Connection;
		import java.sql.Statement;
		import java.sql.ResultSet;
		
		public class OracleQueryRunner extends QueryRunner{
			public Connection createConnection(){
				return null;
			}
			
			protected String createSql(){
				return "select * from customers";
			}
			
			protected ResultSet runSql(Connection conn, String sql) throws Exception{
				Statement stmt = conn.createStatement();
				return stmt.executeQuery(sql);
			}
		}
		
		//客户端
		import java.sql.ResultSet;
		
		public class Client{
			private static QueryRunner runner;
			
			public static void main(String args[]) throws Exception{
				runner = new SybaseQueryRunner();
				ResultSet rs = runner.run();
			}
		}
		以上给出的答案中,使用了模板方法模式,在QueryRunner中,run()方法就是一个模板方法,这个方法代表一个顶极逻辑:返还产寻的结果ResultSet
分享到:
评论

相关推荐

    设计模式之工厂方法模式

    此外,FactoryMethod文件可能是包含更多的代码实例或案例,用于演示如何在实际编程中运用工厂方法模式。例如,可能有一个Java或C#的代码示例,展示了如何创建一个基础的工厂类,然后创建不同的实现类以生产不同类型...

    软件体系结构与设计模式第十二章工厂方法模式.pptx

    软件体系结构与设计模式第十二章工厂方法模式 工厂方法模式是一种常用的设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。这种模式的主要作用是...

    第二讲:工厂方法模式

    在软件设计模式中,工厂方法模式(Factory Method Pattern)是一种创建型模式,它提供了一种创建对象的最佳方式。本讲将深入探讨工厂方法模式的概念、结构以及在实际开发中的应用。 工厂方法模式的核心思想是定义一...

    软件设计模式之创建模式例子

    1. 工厂方法模式(Factory Method):它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。这样可以将对象的创建和对象的使用分离,提高了代码的灵活性和可扩展性。 2...

    C#设计模式_设计模式_C#_

    工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式...

    factory

    2. **工厂方法模式(Factory Method)**:定义一个创建对象的接口,让子类决定实例化哪一个类,工厂方法让类的实例化推迟到子类。 3. **抽象工厂模式(Abstract Factory)**:提供一个创建一系列相关或相互依赖对象...

    07-使用代理快速接入第三方库(1).html

    工厂方法模式( Factory Method ) 抽象工厂模式( Abstract Factory ) 单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( ...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    1. **创建型模式**:包括单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype)。这些模式关注对象的创建过程,使得代码更加灵活,易于管理和扩展。...

    Java设计模式之禅

    5. 工厂方法模式(Factory Method Pattern):定义了一个创建对象的接口,但让子类决定实例化哪一个类。 6. 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确...

    设计模式1-创建型模式

    创建型模式包括Factory Method(工厂方法)、Abstract Factory(抽象工厂)、Builder(建造者)、Prototype(原型)、Singleton(单例)等。这些模式解决了对象的创建问题,提供了一种通用的解决方案。 结构型模式...

    python设计模式

    Factory Method模式是另一种创建型设计模式,它定义了一个创建对象的接口,但让子类决定实例化哪一个类。这样,Factory Method可以使一个类的实例化延迟到其子类。在Python中,可以通过定义一个抽象基类,包含一个...

    java设计模式ppt

    工厂方法模式 (Factory Method Pattern) 工厂方法模式是一种创建型模式,用于定义一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让一个类的实例化延迟到其子类。这种模式的主要优点是将产品类与...

    Java单例模式与工厂模式简单示例代码

    在软件设计模式中,单例模式和工厂模式是两种常用的设计模式,它们分别解决...通过阅读提供的"SimpleFactory"、"Singleton"、"FactoryMethod"和"AbstractFactory"文件,你可以看到这些模式的实际实现,进一步加深理解。

    Delphi模式编程第一分卷

    第4章 工厂方法模式(Factory Method) 4.1 模式解说 4.2 结构和用法 4.2.1 模式结构 4.2.2 代码模板 4.2.3 问题讨论 4.3 范例与实践 4.3.1 利用工厂方法模式设计可动态切换持久层机制的应用 4.3.2 范例小结...

    第四章:Spring AOP API 设计模式1

    3. **工厂方法模式(Factory Method)**:Spring AOP中的`ProxyFactory`是一个典型的工厂方法模式实现,它根据不同的条件创建不同的代理对象,将实例化推迟到子类,提供了更大的灵活性。 4. **原型模式(Prototype...

    Delphi模式编程第二分卷

    第4章 工厂方法模式(Factory Method) 4.1 模式解说 4.2 结构和用法 4.2.1 模式结构 4.2.2 代码模板 4.2.3 问题讨论 4.3 范例与实践 4.3.1 利用工厂方法模式设计可动态切换持久层机制的应用 4.3.2 ...

    《设计模式》中文版(23个设计模式的介绍与运用)

    第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype(原型)—对象创建型 ...

    C#设计模式-C#设计模式

    3. 抽象工厂模式(Abstract Factory): 抽象工厂模式提供一个创建对象族的接口,而无需指定其具体类。在C#中,这在处理跨平台或跨框架的代码时特别有用,因为不同平台可能需要不同类型的对象。 4. 建造者模式...

Global site tag (gtag.js) - Google Analytics