菜鸟学设计模式系列笔记之抽象工厂模式

抽象工厂模式(Abstract Factory模式):

(1)Intent:提供一个创建一系列相关后相互依赖对象的接口,而无需指定它们具体的类-客户端不必指定产品的具体类型,创建多个产品族中的产品对象

(2)Motivation :为保证视感风格标准间的可移植性,应用不应该为一个特定的视感外观硬编码它的窗口组件。在整个应用中实例化特定的视感风格的窗口组建类将使得使得以后很难改变视感的风格。

抽闲工厂模式面对的是多个产品等级结构的系统设计。

工厂方法模式针对的是一个产品等级结构;

抽象工厂模式需要面对多个产品等级结构;

系统包括的元素有:AbstractFactory(抽象工厂)、ConcreteFactory(具体工厂)、AbstractProduct(抽象产品)、ConcreteProduct(具体产品)、Client

通常有多个系列的抽象产品(多种抽象产品为一个产品族)

通常在运行时刻常见一个ConcreteFactory类的实例。这一具体的工厂创建具体特定实现的产品对象。为创建不同的产品对象,客户应使用不同的具体工厂。

AbstractFactory将产品对象的创建延迟到它的ConcreteFactory子类。

应用场景:

(1)一个系统要独立于它的产品的创建、组合和表示时。

(2)一个系统要多个产品系列中的一个来配置时。

(3)当你要强调一系列相关的产品对象的设计以便进行联合使用时

(4)当你提供一个产品类库,而只想显示他们的接口而不是实现时

在联机射击游戏中提供了多种游戏场景,不同的游戏场景配

有不同的地图、背景音乐和不同的天气等,如何创建游戏开

始场景?

贴出部分代码:

//  @ Project : GameScene
//  @ File Name : Music.java
//  @ Date : 2015/4/27
//  @ Author : cooleasy
//
//
public interface Music {
}
//  @ Project : GameScene
//  @ File Name : MusicA.java
//  @ Date : 2015/4/27
//  @ Author : cooleasy
//
//
public class MusicA implements Music {

	public MusicA() {
		super();
		// TODO Auto-generated constructor stub
		System.out.println("create MusicA");
	}

}
//  @ Project : GameScene
//  @ File Name : Map.java
//  @ Date : 2015/4/27
//  @ Author : cooleasy
//
//
public interface Map {
	public void createSky();
	public void ceateHouse();
	public void createRoad();
}
public class MapA implements Map {

	public MapA() {
		super();
		// TODO Auto-generated constructor stub
		System.out.println("create MapA");
	}
	public void createSky(){

	}
	public void ceateHouse(){

	}
	public void createRoad(){

	}
}
//  @ Project : GameScene
//  @ File Name : Weather.java
//  @ Date : 2015/4/27
//  @ Author : cooleasy
//
//
public interface Weather {
}
//  @ Project : GameScene
//  @ File Name : WeatherA.java
//  @ Date : 2015/4/27
//  @ Author : cooleasy
//
//

public class WeatherA implements Weather {

	public WeatherA() {
		super();
		// TODO Auto-generated constructor stub
		System.out.println("create WeatherA");
	}

}
//  @ Project : GameScene
//  @ File Name : SceneFactory.java
//  @ Date : 2015/4/27
//  @ Author : cooleasy
//
//
public interface SceneFactory {
	public Map createMap();
	public Music createMusic();
	public Weather createWeather();
}
public class SceneFactoryA implements SceneFactory {

	public SceneFactoryA() {
		super();
		// TODO Auto-generated constructor stub
		System.out.println("create SceneFactoryA");
	}
	public Map createMap(){
		return new MapA();
	}
	public Music createMusic(){
		return new MusicA();
	}
	public Weather createWeather(){
		return new WeatherA();
	}
}
//  @ Project : GameScene
//  @ File Name : Client.java
//  @ Date : 2015/4/27
//  @ Author : cooleasy
//
public class Client {
	public static void main(String[] arg){
		SceneFactoryA sceneFactoryA =new SceneFactoryA();
		Map mapa=sceneFactoryA.createMap();
		Music musica=sceneFactoryA.createMusic();
		Weather weathera=sceneFactoryA.createWeather();

		SceneFactoryB sceneFactoryB=new SceneFactoryB();
		Map mapb=sceneFactoryB.createMap();
		Music musicb=sceneFactoryB.createMusic();
		Weather weatherb=sceneFactoryB.createWeather();

		SceneFactoryC sceneFactoryC=new SceneFactoryC();
		Map mapc=sceneFactoryC.createMap();
		Music musicc=sceneFactoryC.createMusic();
		Weather weatherc=sceneFactoryC.createWeather();
	}

}

抽象工厂模式优点:

(1)分离了具体的类。抽象工厂模式中一个工厂封装了对象的责任和过程。

(2)易于交换产品系列

(3)有利于产品的一致性

缺点:难以增加新产品的等级结构:需要修改的所有的工厂角色,没有很好支持“开放-封闭”原则。

典型的应用场景:

一个对象族(或一组没有任何关系的对象)有相同的约束

抽象工厂模式提供了一个创建一系列相关或相互依赖的接口,运用抽象工厂模式的关键点在于

应对“多系列对象创建”的需求变化。

时间: 2024-10-25 16:43:02

菜鸟学设计模式系列笔记之抽象工厂模式的相关文章

菜鸟学设计模式系列笔记之创建型模式简介

设计模式是"封装变化"方法的最佳阐释 无论是创建型模式.结构型模式.还是行为型模式,归根结底都是寻找软件中可能存在的"变化",然后利用抽象的方式对这些变化进行封装. 由于抽象没有具体的实现,就代表了一种无限可能性,使得其扩展成为了可能. 经典设计模式都是在寻找软件中的可能变化,并封装这些变化. 封装通常的理解:将数据(属性)和对数据的操作(方法)放到一个程序单元(类)中,从而使得概念上相关的数据和操作在编程语言上相关:正确的理解:信息隐藏--隐藏细节,对对象内部细节

菜鸟学设计模式系列笔记之Prototype模式(原型模式)

菜鸟学设计模式系列笔记之Prototype模式: Intent: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Motivation:以一个已有的对象作为原型,通过它来创建新的对象. 在增加新的对象的时候,新对象的细节创建工作由自己来负责,从而使新对象的创建过程与框架隔离开来. 应用场景: (1)当一个系统应该独立于它的产品创建.构成和表示时 (2)当要实例化的类是在运行时刻指定时,例如动态加载 (3)为了避免创建一个产品类层次平行的工厂类层次时 (4)当一个类的实例只能有几个

菜鸟学设计模式系列笔记之建造者模式(Builder模式)

提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化. 从而保持系统中的"稳定构建算法"不随需求变化而变化.----建造者模式 建造模式是对象的创建模式 建造模式可以将一个产品的内部表象与产品的生成过程分割开来, 从而可以是一个建造过程生成具有不同的内部表象的产品对象. Intent : 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 Motivation: 在复杂对象的构造过程中,允许同样的构造过程能够加入新的被

菜鸟学设计模式系列笔记之工厂方法模式

工厂方法模式(Factory Method): Alias :virtual constructory 虚构造器 Intent: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Motivation:一个框架使用抽象类定义和管理对象之间的关系.这个框架负责去创建这些对象. 工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性(Polymorphic Factory)工厂模式 工厂方法

菜鸟学设计模式系列笔记之单例设计模式(Singleton模式)

特殊的类: (1)类和它的实例间一般是一对多的关系.对大多数的类而言,都可以创建多个实例. 在需要这些实例时创建它们,在这些实例不再有用时删除它们.这些实例的来去伴随着内存的分配和归还. (2)但是有一些类,应该只有一个实例. 这个实例似乎应该在程序启动时被创建出来,且只有在程序结束时才被删除. Intent : 一个类仅有一个实例,自行实例化并向整个系统提供一个访问它的全局访问点 Motivation : 对于一些类来说,只有一个实例是很重要的 Singleton (1)定义一个Instanc

菜鸟学设计模式系列笔记之适配器模式(adapter模式)

一.结构模式简介: 在面向对象软件系统中,每个类都承担了一定的职责,它们可以相互协作,实现一些复杂的功能 结构型模式关注的是如何将现有类或对象组织在一起形成更加强大的结构 不同的结构型模式从不同的角度来组合类和对象 1.结构模式描述如何将类或者对象结合在一起形成更大的结构 (1)类的结构模式:类的结构模式使用继承把类.接口等组合在一起,以形成更大的结构.当一个类从父类继承并实现某接口时,这个新的类就把父类的结构和接口的结构组合起来.类的结构模式是静态的. (2)对象的结构模式:对象的结构模式描述

易学设计模式看书笔记(4) - 抽象工厂模式

 本文内容来自书上,不懂设计模式,只求混个眼熟. 三.抽象工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } pu

设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)

定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(熟悉的new操作符),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式.抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂

大话设计模式读书笔记1——简单工厂模式

最近几日,重温了一下<大话设计模式>这本书,当时读的仓促,有很多没有注意的地方,现在仔细翻看起来,发现这值得细细品味的一本书!! 好东西就要记下来!!! 第一章笔记:从一个简单的计算器程序来看简单工厂模式. 变化的地方就要封装,用一个单独的类来做创造实例的过程这就是工厂. UML图: /// <summary> /// 运算类 /// </summary> public class Operation { public double Number1 { get; set