`
java苹果+番茄
  • 浏览: 65776 次
  • 性别: 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)三个子系统
              对于产品消费者角色来说,任何时候需要某种产品,只需向工厂角色请求即可,而工厂角色在接到请求后,
              会自行判断创建和提供哪一个产品,所以,产品消费者角色无需知道它得到的是哪一个产品,
              产品消费者角色无需修改就可以接纳新的产品,而接纳新的产品意味着要修改这个工厂角色的源代码
              (简单工厂角色只在有限的程度上支持“开—闭”原则)
分享到:
评论

相关推荐

    抽象工厂模式(Abstract Factory Pattern)

    如何像简单工厂模式、工厂方法模式一样绕过常规的"new",然后提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?可能有人会说,你也可以将这些对象一个一个通过工厂方法模式来解决呀?...

    java设计模式

    第二部分 我惹了谁——真刀实枪篇 第7章 单例模式 7.1 我是皇帝我独苗 7.2 单例模式的定义 7.3 单例模式的应用 7.4 单例模式的扩展 7.5 最佳实践 第8章 工厂方法模式 8.1 女娲造人的故事 8.2 工厂方法模式的定义 8.3...

    Delphi模式编程第二分卷

    第二部分 创建型模式编程 第4章 工厂方法模式(Factory Method) 4.1 模式解说 4.2 结构和用法 4.2.1 模式结构 4.2.2 代码模板 4.2.3 问题讨论 4.3 范例与实践 4.3.1 利用工厂方法模式设计可动态...

    第二节 设计模式之创建模式1

    介绍意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决:主要解决接口选择的问题。何时使用:我们明确地

    C#设计模式 C# Design Patterns:A Tutorial

    第二部分 创建型模式 第8章 简单工厂模式 第9章 工厂方法模式 第10章 抽象工厂模式 第11章 单件模式 第12章 生成器模式 第13章 原型模式 第三部分 结构型模式 第14章 适配器模式 第15章 桥接模式 第16章 组合模式 第...

    JavaScript设计模式–简单工厂模式定义与应用案例详解

    工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类。 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便...

    Delphi模式编程第一分卷

    第二部分 创建型模式编程 第4章 工厂方法模式(Factory Method) 4.1 模式解说 4.2 结构和用法 4.2.1 模式结构 4.2.2 代码模板 4.2.3 问题讨论 4.3 范例与实践 4.3.1 利用工厂方法模式设计可动态切换持久层...

    《设计模式实训教程》【PPT+类图与代码+样章】

    第2章面向对象设计原则实训 2.1知识讲解 2.1.1面向对象设计原则概述 2.1.2单一职责原则 2.1.3开闭原则 2.1.4里氏代换原则 2.1.5依赖倒转原则 2.1.6接口隔离原则 2.1.7合成复用原则 2.1.8迪米特法则 2.2实...

    《软件秘笈:设计模式那点事》郑阿奇(编者) -电子工业出版社

    在第1章软件设计模式概述后,从第2章到第24章诠释23个软件设计模式。 1 设计模式概述 1.1 计算机软件的发展现状 1.2 引入设计模式的必要性 1.3 软件设计遵循的基本原则 1.3.1 高内聚、低耦合 1.3.2 面向抽象...

    浅析php工厂模式

    本系列文章来总结一下设计模式在PHP中的应用,这是第二篇创建型模式之工厂模式。 设计模式的一般介绍在第一篇文章讲了,这里就不重复。 工厂模式 实现:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 ...

    Ruby设计模式(中文版+英文版).pdf

    主要包括Ruby概述、使用模板方法变换算法、使用策略替换算法、通过观察器保持协调、通过迭代器遍历集合、使用命令模式完成任务、使用适配器填补空隙、使用装饰器改善对象、单例、使用工厂模式挑选正确的类、通过生成...

    JavaScript模式中文[pdf] 百度云

     第2章 基本技巧  编写可维护的代码  尽量少用全局变量  for循环  for-in循环  不要增加内置的原型  SWitch模式  避免使用隐式类型转换  使用parseInt()的数值约定  编码约定  命名约定  编写注释  ...

    设计模式--C++

    3.2 Builder(生成器)—对象创建型模式 633.3 Factory Method(工厂方法)—对象创建型模式 70 3.4 Prototype(原型)—对象创建型模式 87 3.5 Singleton(单件)—对象创建型模式 84 3.6 创建型模式的讨论 89 第 4...

    设计模式可复用面向对象软件的基础.zip

    第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 ...

    精通python设计模式与源码

    首部分介绍处理对象创建的设计模式,包括工厂模式、建造者模式、原型模式;第二部分介绍处理一个系统中不同实体(类、对象等)之间关系的设计模式,包括外观模式、享元模式等;第三部分介绍处理系统实体之间通信的...

    C#23种设计模式_示例源代码及PDF

    Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消 工厂模式 费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如 何创建及如何向客户端...

    《Java设计模式(第2版)》

    1、创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 2、结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 3、行为型模式...

    javascript设计模式 – 工厂模式原理与应用实例分析

    我们虽然在第二个demo中做了一些优化,但是我们需在使用时明确指定执行方法的名字,这无疑提高了使用成本。那如何实现增加新产品而不影响已有代码?工厂模式应运而生。 定义:定义一个用于创建对象的接口,让子类...

    ActionScript 3.0设计模式扫描版_方红琴译

    第2章 工厂方法模式 什么是工厂方法模式? ActionScript 3.0中的抽象类 工厂方法最小化示例 隐藏产品类 .实例:打印商店管理程序 实例扩展:彩色打印 工厂方法模式中关键的00P概念 实例:Sprite工厂 实例...

    设计模式(.PDF)

    第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 ...

Global site tag (gtag.js) - Google Analytics