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

抽象工厂(Abstract Factory)模式【创建模式第一篇】

阅读更多
前序:现在开始将自己整理的一些java设计模式的笔记与大家共享,希望大家不吝指正,谢谢。
声明:虽然这些都是出自《java设计与模式》一书中,但是是本人的学习心得笔记,请尊重本人劳动,谢谢

抽象工厂(Abstract Factory)模式:

1、抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品类中的产品对象,这就是抽象工厂模式的用意。

2、对抽象工厂模式的用意的理解:
   第一段:一个系统需要多个抽象产品角色,这些抽象产品角色可以用java类实现。
   第二段:根据里氏原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色形同的一些实例,而不是这些抽象产品的实例,换言之,也就是这些抽象产品的具体子类的实例。这就是抽象工厂模式用意的基本含义。
   第三段:抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色。每一个具体工厂角色仅负责某一个具体产品角色的实例化。每一个具体工厂类负责创建抽象产品的某一个具体子类的实例
   “抽象工厂”——“抽象”来自“抽象产品角色”,而“抽象工厂”就是抽象产品角色的工厂。

3、抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要对多个产品等级结构

4、产品族(Product Family):是指位于不同产品等级结构中,功能相关联的产品组成的家族。每一个产品族中含有产品的数目,与产品等级结构的数目是相等的

5、抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。
   假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级机构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引用抽象工厂模式。这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品

6、抽象工厂模式涉及到的角色:
   1) 抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用java接口或者抽象java类实现,而所有的具体工厂类必须实现这个java接口或继承这个这个抽象java类
   2) 具体工厂类角色; 这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体java类实现这个角色
   3) 抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或他们共同拥有的接口。通常使用java接口或者抽象java类实现这一角色
   4)  具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统商业逻辑。通常使用java类实现这个角色

//抽象产品角色
	public interface Creator{
		产品等级结构A的工厂方法
		public ProductA factoryA();
		
		public ProductB factoryB();
	}
	
	//具体工厂类1
	public class ConcreateCreator1 implements Creator{
		public ProductA factoryA(){
			return new ProductA1();
		}
		
		public ProductB factoryB(){
			return new ProductB1();
		}
	}
一般而言,有多少个产品等级结构,就会在工厂角色中发现多少个工厂方法,每一个产品等级结构中有多少具体产品,就有多少个产品族,也就会在工厂等级结构中发现多少个具体工厂
	public class ConcreateCreator2 implements Creator{
		public ProductA factoryA(){
			return new ProductA2();
		}
		
		public ProductB factoryB(){
			return new ProductB2();
		}
	}
	//抽象产品类
	public interface ProductA{
	
	}
	
	public interface ProductB{
	
	}
	//具体产品类
	public class ProductA1 implements ProductA{
		public ProductA1(){
		
		}
	}
	
	public class ProductA2 implements ProductA{
		public ProductA2(){
		
		}
	}
	
	public class ProductB1 implements ProductB{
		//构造子
		public ProductB1(){
		
		}
	}
	
	public class ProductB2 implements ProductB{
		public ProductB2(){
		
		}
	}


7、在以下情况下应当考虑使用抽象工厂模式:
   1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的
   2) 这个系统的产品有多余一个的产品族,而系统之消费其中某一族的产品
   3) 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来
   4) 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现
//抽象工厂类
		public interface Gardener{
		
		}
		
		//具体工厂类
		public class NorthernGardener implements Gardener{
			//水果的工厂方法
			public Fruit createFruit(String name){
				return new NorthernFruit(name);
			}
			
			public Veggie createVeggie(String name){
				return new NorthernVeggie(name);
			}
		}
		
		public class TropicalGardener implements Gardener{
			public Fruit createFruit(String name){
				return new TropicalFruit(name);
			}
			
			public Veggie createVeggie(String name){
				return new TropicalVeggie(name);
			}
		}
		
		//抽象产品类
		public interface Veggie{}
		
		public interface Fruit{}
		
		//具体产品类
		public class NorhthernVeggie implements Veggie{
			private String name;
			public NorthernVeggie(String name){
				this.name = name;
			}
			public String getName(){
				return name;
			}
			public void setName(String name){
				this.name = name;
			}
		}
		
		public class TropicalVeggie implements Veggie{
			private String name;
			public TropicalVeggie(String name){
				this.name = name;
			}
			
			public String getName(){
				return name;
			}
			
			public void SetName(String name){
				this.name = name;
			}
		}
		
		public class NorthernFruit implements Fruit{
			private String name;
			public NorthernFruit(String name){
				this.name = name;
			}
			
			public String getName(){
				return name;
			}
			
			public void setName(String name){
				this.name = name;
			}
		}
		
		public class TropicalFruit implements Fruit{
			private String name;
			public TropicalFruit(String name){
				this.name = name;
			}
			
			public String getName(){
				return name;
			}
			
			public void setName(String name){
				this.name = name;
			}
		}
//在使用时,客户端只需要创建具体工厂的实例,然后调用工厂对象的工厂方法,就可以得到所需要的产品对象


8、“开-闭”原则
   “开-闭”原则要求一个软件系统可以在不修改原有代码的情况下,通过扩展达到增强其功能的目的。对于一个涉及到多个产品等级结构和多个产品族的系统,其功能的增强不外乎两方面:
   1) 增加新的产品族
   2) 增加新的产品等级结构

   1、增加新的产品族:在产品等级结构的数目不变的情况下,增加新的产品族,就意味着在每一个产品等级结构中增加一个(或者多个)新的具体(或者抽象和具体)产品角色。所以设计师只需要向系统中加入新的具体工厂类就可以了,没有必要修改已有的角色产品角色。因此,在系统中的产品族增加时。抽象工厂模式是支持“开——闭”原则的。

   2、增加新的产品等级结构:在产品族的数目不变的情况下,增加新的产品等级结构。所有的产品等级结构中的产品数目不会改变,但是现在多出一个与现有的产品等级结构平行的新的产品等级结构,要做到这一点,就需要修改所有的工厂角色,给每一个工厂类都增加一个新的工厂方法,而这显然是违背“开-闭”原则的。换言之,对于产品等级结构的增加,抽象工厂模式是不支持“开-闭”原则的。

   综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新的产品族的增加提供方便,而不能为新的产品等级结构增加提供这样
的方便。
4
0
分享到:
评论
3 楼 yu11223344 2010-07-30  
尤其是开篇一大推概念,弄得头晕了~~~
2 楼 yu11223344 2010-07-30  
总结的很好,第一遍看下来,不太明白,再来一遍……
1 楼 alosin 2009-12-30  
照着书上来的?没自己的理解啊,

相关推荐

    抽象工厂模式(Abstract Factory Pattern)

    咱们假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在你的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然...

    Java与模式

    第14章 抽象工厂\(Abstract Factory\)模式 第15章 单例\(Singleton\)模式 第16章 专题:单例模式与MX记录 第17章 专题:多例\(Multiton\)模式与多语言支持 第18章 专题:序列键生成器与单例及多例模式 第19章 ...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第17章 抽象工厂(abstract factory)模式 148 第18章 原型(prototype)模式 158 第19章 备忘录(memento)模式 163 第20章 操作型模式介绍 176 第21章 模板方法(template method)模式 182 第22章 状态(state)模式 193 第...

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

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

    设计模式--C++

    3.1 Abstract Factory(抽象工厂)—对象创建型模式 57 3.2 Builder(生成器)—对象创建型模式 633.3 Factory Method(工厂方法)—对象创建型模式 70 3.4 Prototype(原型)—对象创建型模式 87 3.5 Singleton...

    GOLF设计模式(C++语言版)

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

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

    第四章:Spring AOP 设计模式小马哥(mercyblitz)Spring AOP 设计模式抽象工厂模式(Abstract factory)实现构建器模式

    设计模式(.PDF)

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

    Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides23种设计模式

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

    Delphi模式编程第一分卷

    第5章 抽象工厂模式(Abstract Factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 5.3.1 用抽象工厂模式动态构造界面风格 5.3.2 WebSnap的Web Module架构与抽象工厂模式 ...

    研磨设计模式(完整带书签).part2.pdf

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

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

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

    《国外写的,翻译版本》设计模式

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

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

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

    设计模式文档

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

    设计模式 design pattern

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

    JAVA经典设计模式大全

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

    研磨设计模式(完整带书签).part1.pdf

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

    设计模式___

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

    设计模式(Design.Patterns.CHN)

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

Global site tag (gtag.js) - Google Analytics