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

工厂模式【创建模式第二篇】

阅读更多
工厂模式的几种形态:
1、简单工厂模式,又叫做静态工厂方法(Static Factory Method)模式。
2、工厂方法模式,又称为多态性工厂(Polymorphic Factory)模式
3、抽象工厂模式,又称工具(Kit或ToolKit)模式

简单工厂模式(Simple Factory)

1、模式:
简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。
它是由一个工厂对象决定创建出哪一种产品类的实例。
2、举例:
		//水果接口
		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 harvented.");
			}
			
			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;
			}
		}
		
		//葡萄类
		public class Grape implements Fruit{
			private boolean seedless;
			
			public void grow(){
				log("Grape is growing...");
			}
			
			public void harvest(){
				log("Grape has been harvested.");
			}
			
			public void plant(){
				log("Grape has been planted.");
			}
			
			public static void log(String msg){
				System.out.println(msg);
			}
			
			//有无籽方法
			public boolean getSeedless(){
				return seedless;
			}
			
			public void setSeedlees(boolean seedless){
				this.seedless = seedless;
			}
		}
		
		//草莓类
		public class Strawberry implements Fruit{
			public void grow(){
				log("Strawberry is growing...");
			}
			
			public void harvest(){
				log("Strawberry has been harvested.");
			}
			
			public void plant(){
				log("Strawberry has been planted.");
			}
			
			public static void log(String msg){
				System.out.println(msg);
			}
		}
		
		//农场园丁类,由他决定创建哪种水果类的实例
		public class FruitGardener{
			//静态工厂方法
			public static Fruit factory(String which) throws BadFruitException{
				if(which.equalslgnoreCase("apple")){
					return new Apple();
				}else if(which.equalslgnoreCase("grape")){
					return new Grape();
				}else if(which.equalslgnoreCase("strawberry")){
					return new Strawberry();
				}else{
					throw new BadFruitException("Bad fruit request");
				}	
			}
		}
		
		//异常类
		public class BadFruitException extends Exception{
			public BadFruitException(String msg){
				super(msg);
			}
		}
		
		//测试类
		public class Test{
			FruitGardener gardener =new FruitGardener();
			try{
				gardener.factory("grape");
				gardener.factory("apple");
				gardener.factory("strawberry");
				gardener.factory("banana");	//抛出异常
			}catch(BadFruitException e){
				System.out.println("dont't has this fruit.");
			}
		}
		

3、三个角色:
1、工厂类(Creator)角色:在客户端的直接调用下创建产品对象
2、抽象产品角色:可以用一个接口或者一个抽象类实现
3、具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例

4、如果工厂方法总是循环使用同一个产品对象,那么这个工厂对象可以使用一个属性来存储这个产品对象。
   每一次客户端调用工厂方法时,工厂方法总是提供这同一个对象。
   如果工厂方法永远循环使用固定数目的一些产品对象,而且这些产品对象的数目并不大的话,
   可以使用一些私有属性存储对这些产品对象的引用。比如:一个永远只提供一个产品对象的工厂对象
   可以使用一个静态变量存储对这个产品对象的引用。
   如果工厂方法使用数目不确定,或者数目较大的一些产品对象的话,使用属性变量存储对这些产品对象的引用就不方便了,
   这时候 就应当使用聚集对象存储对产品对象的引用。
 
  5、其他模式;
  1、单例模式:单例模式要求单例类的构造子是私有的,从而客户端不能直接将之实例化,而必须通过这个静态工厂方法将之实例化,
       而且单例类自身是自己的工厂角色。单例类自己负责创建自身的实例
       单例类使用一个静态属性存储自己的唯一的实例,工厂方法永远仅提供这一个实例
      
  2、多例模式:它是对单例模式的推广,多例模式也禁止外界直接将之实例化,同时通过静态工厂方法想外界提供循环使用的自身的实例,
       多例模式可以有多个实例
       多例模式具有一个聚集属性,通过向这个聚集属性登记已经创建过的实例达到循环使用实例的目的,
       它还拥有一个内部状态,每一个内部状态都只有一个实例存在
       根据外界传入的参量,工厂方法可以查询自己的登记聚集,如果具有这个状态的实例已经存在,
       就直接将这个实例提供给外界:反之,就首先创建一个新的满足要求的实例,将之登记到聚集中,然后再提供客户端。
 
  3、备忘录模式:单例模式和多例模式使用一个属性或者聚集属性来登记所创建的产品对象,一边可以通过查询这个属性或者聚集属性
         找到并共享已经创建了的产品对象,这就是备忘录模式的应用。
        
  4、MVC模式:是更高层次上的架构模式。
       包括:合成模式、策略模式、观察者模式、也有可能会包括装饰模式、调停者模式、迭代子模式以及工厂方法模式等。
      
  ****:如果系统需要有多个控制器参与这个过程的话,简单工厂模式就不适合了,应当考虑使用工厂方法模式。
 
  6、简单工厂模式的优点己缺点
  优点:模式的核心是工厂类,这个类有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。
        而客户端则可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。简单工厂模式通过这种做法实现了对责任的分割
       
  缺点:1)这个工厂类集中了所有的产品创建逻辑,形成一个无所不知的全能类,有人把这种类叫做上帝类(God Class)。
          如果这个全能类代表的是农场的一个具体园丁的话,那么这个园丁就需要对所有的产品负责,成了农场的关键人物,
          他什么时候不能正常工作了,整个农场都要受到影响;
         
        2)将这么多的逻辑集中放在一个类里面的另外一个缺点是,当产品类有不同的接口种类时,工厂需要判断在什么时候创建某种产品,
          这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难。
          这一缺点在工厂方法模式中得到克服
       
        3)由于简单工厂模式使用静态方法作为工厂反尬,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。
           这一缺点会在工厂方法模式中得到克服
 
  7、“开——闭”原则要求一个系统的设计能够允许系统在无需修改的情况下,扩展其功能。
      要求系统允许当新的产品加入系统中时,而无需对现有代码进行修改,这一点对于产品消费者角色是成立的,而对于工厂角色是不成立的
     
     一般而言:一个系统总是可以划分成为产品的消费者角色(Client)、产品的工厂角色(Factory)以及产品角色(Product)三个子系统
              对于产品消费者角色来说,任何时候需要某种产品,只需向工厂角色请求即可,而工厂角色在接到请求后,
              会自行判断创建和提供哪一个产品,所以,产品消费者角色无需知道它得到的是哪一个产品,
              产品消费者角色无需修改就可以接纳新的产品,而接纳新的产品意味着要修改这个工厂角色的源代码
              (简单工厂角色只在有限的程度上支持“开—闭”原则)
分享到:
评论

相关推荐

    设计模式之单例模式(结合工厂模式)

    结合工厂模式,可以进一步优化单例的创建过程,提高代码的可读性和可维护性。 单例模式的核心在于控制类的实例化过程,常见的实现方式有懒汉式、饿汉式和双重检查锁定(DCL)等。懒汉式是在类被加载时并不创建实例...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂 第二部分

    例如,一个Web应用可能采用MVC模式组织结构,使用单例模式管理数据库连接,同时通过工厂模式创建不同类型的业务对象,而代理模式可以用来添加事务处理等额外功能。通过学习和熟练掌握这些设计模式,开发者能够更好地...

    设计模式(简单工厂模式_排序)手写代码.rar

    简单工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象的最佳方式。在简单工厂模式中,一个工厂类负责创建所有相关的或者相互依赖的对象,无需客户端代码指定具体的类,而是通过工厂方法来创建实例。...

    .net工厂模式原理视频教程

    视频1219am.wmv可能是教程的第一部分,详细讲解工厂模式的基础知识和基本实现,帮助初学者理解这一重要的设计模式。观看这个教程,开发者能够更好地理解和掌握.NET中的工厂模式,从而提升软件设计的质量和可维护性。

    设计模式_--_工厂模式和单件模式

    在本篇文章中,我们将深入探讨两种广泛使用的软件设计模式:工厂模式和单例模式。这两种模式在软件开发中非常常见,能够帮助开发者解决一些常见的编程问题。 #### 二、工厂模式 **1. 应用背景** 在面向对象编程中...

    一例读懂设计模式-单例模式、简单工厂模式.zip

    2. **简单工厂模式**: 简单工厂模式是一种创建型设计模式,它提供一个工厂类来负责创建对象,而不是让客户端代码直接创建。这样,客户端可以避免知道具体类的细节,只需调用工厂方法即可获取所需对象。 - 工厂类...

    简单工厂模式.zip

    简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这种模式使代码能够将实例化过程封装起来,使得客户端代码无需知道具体的产品类名,只需要知道产品类型即可。在C#中...

    设计模式之简单工厂模式

    `01第一讲简单工厂模式.ppt`文件通常会包含深入的理论讲解、模式结构图、示例代码以及应用场景的分析,有助于初学者更好地理解简单工厂模式的工作原理和实践应用。 ### 7. 实际应用 简单工厂模式常用于框架和库中,...

    简单工厂模式计算器(C#源码)

    简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这种模式使代码能够将实例化过程封装起来,使得客户端代码无需关心具体的实现细节,只需要知道如何调用即可。在本例...

    三种工厂设计模式和两种单例模式

    2. **抽象工厂模式**:它是工厂模式的一种扩展,关注于创建相关或依赖对象的家族,而无需指定它们的具体类。抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体实现。当系统需要不同...

    第四讲:工厂模式在开发中的运用

    2. 框架与库:Spring框架中的BeanFactory和ApplicationContext就是工厂模式的典型应用,它们负责根据配置信息创建和管理Bean。 3. GUI组件:如Swing或JavaFX,开发者可以通过特定的工厂类来创建各种界面组件,如...

    javaweb项目+设计模式(单例模式,工厂模式,动态代理,适配器)

    在这个`CloudMusic`项目中,可以预见的是,单例模式可能被用来管理数据库连接,工厂模式用于根据需求创建不同的音乐播放器对象,动态代理可能用于实现用户行为的日志记录或权限控制,而适配器模式则可能用于集成第三...

    第5讲 工厂模式(简单工厂、抽象工厂)

    工厂模式是一种设计模式,主要用来解决对象创建的问题,特别是当有多个相关联的具体类需要实例化,而这些实例化操作可能会随着需求的变化而变化时。工厂模式的核心思想是定义一个创建对象的接口(或者抽象类),但让...

    javascript设计模式之工厂模式.docx

    在 JavaScript 中,工厂模式可以应用于各种场景,例如创建复杂对象、封装第三方库的接口、简化代码的编写等。 例如,在 jQuery 库中,$() 函数就是一个工厂模式的应用。它可以根据选择器创建一个 jQuery 对象,并...

    MVC工厂模式。

    总结起来,MVC工厂模式结合了MVC架构的分层思想和工厂模式的动态对象创建,为Web应用提供了良好的可扩展性和可配置性。通过这种设计,开发者能够更专注于业务逻辑,而不是底层数据库系统的细节,从而提升开发效率和...

    新版设计模式手册 - C#设计模式(第二版)

    1. 创建型模式:这类模式涉及到对象的创建,如单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。例如,单例模式确保一个类只有一个实例,并提供全局访问点,而在C#中可以通过`Lazy<T>`类或静态类实现。...

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

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

    Head First 设计模式 +Java设计模式(第2版)

    例如,工厂模式用于创建对象,避免硬编码类名;观察者模式用于对象之间的事件通知,实现松耦合;装饰器模式可以动态地增加对象的功能;而单例模式则确保一个类只有一个实例,常用于资源管理。 在学习这两本书时,...

    第九课 工厂模式1

    当系统中存在多个相关或相互依赖的对象,而这些对象的创建逻辑变得复杂时,工厂模式就显得尤为重要。例如,当需要动态地根据条件创建不同类型的实例时,传统的new运算符直接实例化的方式可能会导致代码难以管理和...

Global site tag (gtag.js) - Google Analytics