`
java苹果+番茄
  • 浏览: 69190 次
  • 性别: 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  
照着书上来的?没自己的理解啊,

相关推荐

    第三讲:抽象工厂模式

    1. **抽象工厂(Abstract Factory)**:这是模式的核心,定义了一组创建产品对象的接口。这个接口通常包含多个方法,每个方法对应一种产品类型。 2. **具体工厂(Concrete Factory)**:实现了抽象工厂接口,负责...

    抽象工厂模式在net多层分布式程序中的应用.pdf

    - **抽象工厂(AbstractFactory)**:声明一个创建抽象产品对象的操作接口。 - **具体工厂(ConcreteFactory)**:实现创建具体产品对象的操作。 - **抽象产品(AbstractProduct)**:为一类产品对象声明一个接口。 ...

    第5次实验张超红抽象工厂方法设计模式实验.doc

    抽象工厂方法设计模式是一种创建型设计模式,它提供了一种方式,可以在不指定具体类的情况下创建一系列相关或依赖对象。 在本次实验中,实验的主体是张超红,实验目的是为了加深对抽象工厂方法设计模式及其作为创建...

    [浪曦原创]JAVA设计模式 第4讲 抽象工厂(jzkangta)

    1. **抽象工厂(Abstract Factory)**:这是模式的核心,定义了一个创建对象的接口,但不直接实例化具体产品,而是由具体的工厂实现。在Java中,这个角色通常由一个接口或抽象类来扮演。 2. **具体工厂(Concrete ...

    第6章抽象工厂模式.pptx

    1. AbstractFactory(抽象工厂):定义一个创建产品对象的接口,通常包含多个创建不同产品的方法。 2. ConcreteFactory(具体工厂):实现抽象工厂接口,提供实际的产品创建逻辑,每个具体工厂对应一个产品族。 3. ...

    第6章 抽象工厂模式.pptx

    - **抽象工厂(AbstractFactory)**:定义了一个用于创建产品族的接口。 - **具体工厂(ConcreteFactory)**:实现了抽象工厂接口,并根据具体需求创建相应的产品族。 - **抽象产品(AbstractProduct)**:定义了...

    GuiLibrary_AbstractFactory:Programmbeispielfürdas模式“抽象工厂”

    【描述】:“GuiLibrary_AbstractFactory”是一个C#编程的示例,它演示了如何应用抽象工厂模式来设计图形用户界面(GUI)组件的工厂。代码可能包含了多个工厂类,每个工厂负责创建特定类型的GUI元素,这些元素可能...

    吉林大学设计模式2012第七题1

    抽象工厂模式(Abstract Factory Pattern)主要用来创建一系列相关的或相互依赖的对象,而无需指定它们的具体类。它提供了一个接口,用于创建一组相关或相互依赖的对象,而无需指定其具体类。这种模式的关键在于抽象...

    .net抽象工厂实现登录查询

    1. **抽象工厂模式**:抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象的家族,而无需指定它们的具体类。在.NET中,我们可以通过定义一个接口(如`IUserLoginFactory`)作为抽象工厂,...

    设计模式之工厂方法模式

    工厂方法模式主要包含四个角色:抽象工厂(Abstract Factory)、具体工厂(Concrete Factory)、抽象产品(Abstract Product)和具体产品(Concrete Product)。抽象工厂定义了创建产品的接口,具体工厂实现这个接口...

    23种设计模式UML类图及对应示例代码

    1. **抽象工厂类** (`AbstractFactory`) 定义了两个方法 `CreateProductA()` 和 `CreateProductB()`,分别用于创建两种不同类型的产品。 2. **具体工厂类** (`ConcreteFactory1` 和 `ConcreteFactory2`) 分别继承自...

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

    2. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。它适用于当产品族中的对象需要一起工作时,确保所有产品都属于同一族,并且能够适应产品族可能的扩展...

    23种设计模式java版

    // 创建第一个抽象工厂实例 AbstractFactory factory1 = new ConcreteFactory1(); Client client1 = new Client(factory1); client1.Run(); // 创建第二个抽象工厂实例 AbstractFactory factory2 = new ...

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

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

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

    抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator ...

    Java与模式

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

    第2.6章 讨论1

    首先,抽象工厂模式是一种提供创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类的设计模式。它允许客户端使用一个公共接口来创建一组相关的产品,而不必了解这些产品的具体实现。抽象工厂通常包含多个...

    设计模式(.PDF)

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

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

    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