您的位置:首页 > 其它

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

2015-04-27 16:19 513 查看
抽象工厂模式(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)有利于产品的一致性

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

典型的应用场景:

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

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

应对“多系列对象创建”的需求变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式