【设计模式系列】--抽象工厂

在前面中,介绍过工厂方法模式,那么抽象工厂和工厂方法模式有哪些不一样呢?抽象工厂又可以解决什么样的问题呢?她在实际应用中又是如何发挥她的作用呢?今天这篇博文小编来主要简单的介绍一下抽象工厂模式,希望对有需要的小伙伴有帮助,不足之处,还请小伙伴多多指教。首先,我们来看一下什么是抽象工厂模式:
什么是抽象工厂?

抽象工厂模式是所有形态的工厂模式中最为抽象和最具其一般性的,抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。简单来说就是,抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。以之前的demo为例,拷贝Apple、Banana、Fruit,并且修改Apple和Banana的代码部分,如下所示,首先修改Apple的代码部分:

public abstract class Apple implements Fruit  {
	/**
	 * 采集
	 */
	public abstract void get();

}

Banana的代码部分,如下所示:

public abstract class Banana implements Fruit {
	/**
	 * 采集
	 */
	public abstract void get();
}

新建类NorthApple并继承Apple,编写代码如下所示:

public class NorthApple extends Apple {

	@Override
	public void get() {
		System.out.println("采集北方苹果");

	}

}

同样新建南方苹果类SouthApple,继承Apple类,并编写相关的代码部分,如下所示:

public class SouthApple extends Apple {

	@Override
	public void get() {
		System.out.println("采集南方苹果");

	}

}

同样新建NorthBanana和SouthBanana,代码类似NorthApple和SouthBanana,小编在这里就不一一进行介绍了,接着新建类FruitFactory,编写相关的代码部分,如下所示:

public interface FruitFactory {
	//实例化Apple
	public Fruit getApple();
	//实例化Banana
	public Fruit getBanana();

}

新建类NorthFruitFactory,编写相关代码部分,如下所示:

public class NorthFruitFactory implements FruitFactory {

	@Override
	public Fruit getApple() {
		return new NorthApple();

	}

	@Override
	public Fruit getBanana() {
		return new NorthBanana();

	}

}

同样的需要新建SouthFruitFactory,代码部分和NorthFruitFactory类似,不在赘述,新建类,MainClass,编写相关代码如下所示:

public class MainClass {
	public static void main(String[] args){
		FruitFactory ff = new NorthFruitFactory();
		Fruit apple = ff.getApple();
		apple.get();

		Fruit banana = ff.getBanana();
		banana.get();

		FruitFactory ff2 = new SouthFruitFactory();
		Fruit apple2 = ff2.getApple();
		apple2.get();

		Fruit banana2 = ff2.getBanana();
		banana2.get();
	}

}

接着,我们来运行一下,效果如下所示:

添加类WenshiApple类,并继承Apple类,编写代码如下所示:

public class WenshiApple extends Apple {

	@Override
	public void get() {
		System.out.println("采集温室苹果");

	}

}

同样的编写WenshiBanana,并继承Banana,编写相关代码和上述类似。
接着创建WenshiFruitFactory并实现FruitFactory,编写相关代码部分,如下所示:

public class WenshiFruitFactory implements FruitFactory {

	@Override
	public Fruit getApple() {
		return new WenshiApple();
	}

	@Override
	public Fruit getBanana() {
		return new WenshiBanana();
	}

}

编写MainClass里面的代码部分,如下所示:

public class MainClass {
	public static void main(String[] args){
		FruitFactory ff = new NorthFruitFactory();
		Fruit apple = ff.getApple();
		apple.get();

		Fruit banana = ff.getBanana();
		banana.get();

		FruitFactory ff2 = new SouthFruitFactory();
		Fruit apple2 = ff2.getApple();
		apple2.get();

		Fruit banana2 = ff2.getBanana();
		banana2.get();

		FruitFactory ff3 = new WenshiFruitFactory();
		Fruit apple3 = ff3.getApple();
		apple3.get();

		Fruit banana3 = ff3.getBanana();
		banana3.get();

	}

}

我们来看一下运行效果,如下所示:

模式中包含的角色及其职责

抽象工厂(Creator)角色
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
具体工厂(Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
抽象(Product)角色
抽象模式所创建的所有对象的父类,她负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色

抽象模式所创建的具体实例对象

小编寄语:该博文,小编主要介绍了抽象工厂,结合之前学习过的模式,我们发现无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

时间: 2024-10-31 04:30:14

【设计模式系列】--抽象工厂的相关文章

C#设计模式(4)——抽象工厂模式

原文:C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专

Android设计模式系列之工厂方法模式_Android

工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式. android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具管理类. 今天以ThreadFactory举例说明一下简单工厂模式和工厂方法模式. 工厂方法模式,Factory Method,简单的方式,不简单的应用. 1.意图 定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方式模式使一个类的实例化延迟到其子类. 热门词汇:虚构造器 延迟 创建对象

.NET简谈设计模式之(抽象工厂模式)

我们继续学习设计模式系列文章. 今天要讲的是设计模式中经常被用到的"工厂模式",所谓工厂模式就是将对象的创建交给一个叫做工厂的对象来统一进行处理.主要是将对象的依赖关系进行解耦,消除对象之间的直接耦合.那么工厂的使用有几种方式呢?那就要看我们对工厂的理解了,工厂是创建对象的一个逻辑名称,工厂可以是一个方法.一个静态类等等.只要起到对象的创建就能给它赋予上一个工厂的名称. 那么什么是抽象工厂呢?我想很多人对它的理解并不是很透彻,甚至有的人就觉得工厂一定要是抽象的.我表示不理解,一个抽象类

乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) 作者:webabcd 介绍 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例 有Message和MessageModel,Message有一个Insert()方法,该方法的参数是MessageModel. AbstractMessageModel usi

设计模式之四(抽象工厂模式第三回合)

原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如IFactory factory=new AccessFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置.我们的设计不能去防止需要的变更,那么我们的理想便是让改动变得最小,那么现在如果你要更改数据库访问,

设计模式之四(抽象工厂模式第一回合)

原文:设计模式之四(抽象工厂模式第一回合) 前言 首先关于抽象工厂模式的学习,我们需要慢慢的,由浅入深的进入.不能单刀直入,否则可能达不到预期学明白的目标. 第一回合  首先我们从最简单的数据访问程序开始吧. 下面先来看一个简单的小例子,代码很简单 public class User { public int ID{get;set;} public string Name{get;set;} } 一个简单的实体类,也相当于在SqlServer数据库中建立了相同的数据表 public class

C++设计模式之抽象工厂模式_C 语言

问题描述 之前讲到了C++设计模式--工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Product的,所以工厂方法模式中,每个工厂只能创建单一种类的产品,当需要生产一种全新的产品(不继承自Product)时,发现工厂方法是心有余而力不足. 举个例子来说:一个显示器电路板厂商,旗下的显示器电路板种类有非液晶的和液晶的:这个时候,厂商建造两个工厂,工厂A负责生产非液晶显示器电路板,工厂B负责生产

设计模式之抽象工厂模式

关于设计模式找到了一个系列讲的非常到位,也很容易让人理解,这里我也是看下面的博客来理解抽象工厂模式. http://blog.csdn.net/column/details/loveyun.html?&page=2 理解抽象工厂应先了解产品族.产品等级的概念: 所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族.比如AMD的主板.芯片组.CPU组成一个家族,Intel的主板.芯片组.CPU组成一个家族.而这两个家族都来自于三个产品等级:主板.芯片组.CPU.一个等级结构是由相同的

艾伟_转载:.NET设计模式:抽象工厂模式(Abstract Factory)

概述 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或

设计模式:抽象工厂方法模式

之前写的模式帖子:  设计模式系列目录 今天说一下抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么,这样一来,客户就从具体的产品中被解耦 我之前说过设计模式:工厂方法模式,我们最后会做一下两种模式的区别 我们看用类图看一下这个模式 每个抽象产品都有多于一个的一个人的具体子类,工厂角色怎么知道实例化哪一个子类?比如我们这个图,每个抽象产品都有两个具体产品, 抽象工厂有两个具体