`
wangdongsong
  • 浏览: 35218 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

学习设计模式系列之——抽象工厂(Java)

阅读更多

请各们前辈指点,本人初学者。

 

抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。


现在有一水果接口:Fruit

/** 
 * Fruit接口
 * 2010-6-26 下午09:50:57
 */
public interface Fruit {

	/**
	 * 摘取
	 */
	public void get();
	
}

 

目前有两种水果的结构,分别是苹果和香蕉,由于苹果和香蕉的产地不同或者种法不同,又进行了分类,比如说苹果依据产地分为北方苹果和南方苹果,香蕉也是如此分类,因此,Apple类和Banana类的get方法不能具体实现,只定义,具体的实现由其子类实现,代码如下:

/** 
 * 苹果类
 * 2010-6-26 下午09:45:41
 */
public abstract class Apple implements Fruit{
	
	/**
	 * 采集苹果
	 * 2010-6-26 下午09:46:20
	 */
	public abstract void get();
}

/** 
 * 香蕉类
 * 2010-6-26 下午09:46:59
 */
public abstract class Banana implements Fruit{

	/**
	 * 采集
	 * 2010-6-26 下午09:47:16
	 */
	public abstract void get();
}

 

如上所说,现在由于产地不同进行了分类,分为南方和北方的苹果和香蕉,代码如下:

/** 
 * 北方苹果
 * 2010-7-5 下午09:43:36
 */
public class NorthApple extends Apple {

	/* (non-Javadoc)
	 * @see Apple#get()
	 */
	@Override
	public void get() {
		System.out.println(" 采集北方苹果");
	}

}

/** 
 * 北方香蕉
 * 2010-7-5 下午09:45:09
 */
public class NorthBanana extends Banana {

	/* (non-Javadoc)
	 * @see Banana#get()
	 */
	@Override
	public void get() {
		System.out.println("采集北方香蕉");
	}

}

/** 
 * 南方苹果
 * 2010-7-5 下午09:44:08
 */
public class SouthApple extends Apple {

	/* (non-Javadoc)
	 * @see Apple#get()
	 */
	@Override
	public void get() {
		System.out.println("采集南方苹果");
	}

}

/** 
 * 南方香蕉
 * 2010-7-5 下午09:45:34
 */
public class SouthBanan extends Banana {

	/* (non-Javadoc)
	 * @see Banana#get()
	 */
	@Override
	public void get() {
		System.out.println("采集南方苹果");
	}

}

 

由于水果根据产地进行了分类,那么产生水果的工厂也要根据产地进行生产,那么FruitFactory接口只负责水果结构(如产生一个苹果和一个香蕉,但不分产地,具体实现由子类)的产生,代码如下:

/** 
 * 水果工厂接口
 * 2010-6-26 下午09:53:48
 */
public interface FruitFactory {
	/**
	 * 实例化Apple
	 * 2010-7-5 下午09:49:51
	 */
	public Fruit getApple();
	
	/**
	 * 实例化Banana
	 * 2010-7-5 下午09:50:18
	 */
	public Fruit getBanana();
}

 

由于水果进行了产地的区分,因此我们分别建立NorthFruitFacotry和SouthFruitFactory分别生产北方水果和南方水果,代码如下:

/** 
 * 北方水果生产工厂
 * 2010-7-5 下午09:51:25
 */
public class NorthFuritFactory implements FruitFactory {

	/* (non-Javadoc)
	 * @see FruitFactory#getApple()
	 */
	@Override
	public Fruit getApple() {
		return new NorthApple();
	}

	/* (non-Javadoc)
	 * @see FruitFactory#getBanana()
	 */
	@Override
	public Fruit getBanana() {
		return new NorthBanana();
	}

}

/** 
 * 南方水果生产工厂
 * 2010-7-5 下午09:53:23
 */
public class SouthFruitFacotry implements FruitFactory {

	/* (non-Javadoc)
	 * @see FruitFactory#getApple()
	 */
	@Override
	public Fruit getApple() {

		return new SouthApple();
	}

	/* (non-Javadoc)
	 * @see FruitFactory#getBanana()
	 */
	@Override
	public Fruit getBanana() {

		return new SouthBanan();
	}

}

 

优点:当我们增加产品族,例如我们增加一个温室苹果和香蕉时,我们只需扩展一个温室苹果类(WenShiApple)和温室香蕉类(WenShiBanana)即可,代码如下:

/** 
 * 温室苹果
 * 2010-7-5 下午09:58:11
 */
public class WenShiApple extends Apple {

	/* (non-Javadoc)
	 * @see Apple#get()
	 */
	@Override
	public void get() {
		System.out.println("采集温室苹果");
	}

}


/** 
 * 温室香蕉
 * 2010-7-5 下午09:58:38
 */
public class WenShiBanana extends Banana {

	/* (non-Javadoc)
	 * @see Banana#get()
	 */
	@Override
	public void get() {
		System.out.println("采集温室香蕉");
	}

}

 

之后,我们建立一个专门生产温室水果的工厂类,代码如下:

/** 
 * 温室水果生产工厂类
 * 2010-7-5 下午09:59:47
 */
public class WenShiFruitFactory implements FruitFactory {

	/* (non-Javadoc)
	 * @see FruitFactory#getApple()
	 */
	@Override
	public Fruit getApple() {

		return new WenShiApple();
	}

	/* (non-Javadoc)
	 * @see FruitFactory#getBanana()
	 */
	@Override
	public Fruit getBanana() {

		return new WenShiBanana();
	}

}

 

 

到此,我们增加一个新的水果族:温室水果,这样的扩展是符合OCP原则的。

但是,如果我们增加一个新的水果结构的话,就不符合了,例如增加一个水果结构:西瓜,这个是抽象工厂的缺点。

0
0
分享到:
评论
1 楼 luoshulong 2010-07-09  
请问一个顾客来买水果  他对FruitFactory要来自南方的水果?这个怎么写?但是顾客不能跨过FruitFactory直接去选择,因为他不了解内部的信息,他只提供一句话!即判断方法不能在BS里面写

相关推荐

    java23种设计模式——图解——附带源码

    java23种设计模式 工厂模式 ,抽象工厂,建造者模式,单态模式,原型模式

    SETema5:软件设计模式——抽象工厂

    SETema5 软件设计模式——抽象工厂

    Java设计模式 版本2

    Java设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...

    设计模式——JAVA.docx

    JAVA设计模式总结之23种设计模式 一:设计模式之六大原则 总原则:开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。 1.Abstract Factory(抽象工厂模式) 2.Adapter(适配器模式)......

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    Java设计模式——工厂设计模式

    抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。 DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对...

    深入浅出设计模式(中文版电子版)

    3.3AbstractFactoryPattern(抽象工厂模式) 45 3.3.1定义 45 3.3.2现实例子——扩展了的兵工厂 48 3.3.3C#实例——大陆生态系统 49 3.3.4Java实例——电脑产品 52 3.3.5优势和缺陷 57 3.3.6应用情景 57 3.4...

    深入浅出设计模式(中文版)

    3.3AbstractFactoryPattern(抽象工厂模式) 45 3.3.1定义 45 3.3.2现实例子——扩展了的兵工厂 48 3.3.3C#实例——大陆生态系统 49 3.3.4Java实例——电脑产品 52 3.3.5优势和缺陷 57 3.3.6应用情景 57 3.4...

    design-pattern-java.pdf

    基础知识 基础知识设计模式概述 从招式与内功谈起——设计模式概述(一) 从招式与内功谈起——设计模式概述(二) 从招式与内功谈起——设计模式概述(三) 面向对象设计原则 面向对象设计原则之单一职责原则 面向...

    Java设计模式:工厂模式——图文+代码示例(通俗易懂)

    先来看看,简单工厂模式——也叫静态工厂模式,这里举个例子:你要去买一台手机,你不用关心手机是怎么生产出来的,里面的零件具体又是怎么制造的,这些通通都交给工厂去处理,你尽管去买手机就好了。 简单工厂模式...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷3

    pattern/src/creation/abstractfactory //11.2抽象工厂模式 pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷1

    pattern/src/creation/abstractfactory //11.2抽象工厂模式 pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 ...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例模式 行为模式 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷9

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    设计模式Demo

    创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷10

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷5

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

Global site tag (gtag.js) - Google Analytics