抽象工厂设计模式
来源:http://www.7dit.com 作者:7dit 发布日期:2008-09-21 01:36:01 点击量:500
工厂方法如下:
1 class RoadFactory
2 {
3 public static Road CreateRoad()
4 {
5 return new Road();
6 }
7 public static Building CreateBuilding()
8 {
9 return new Building();
10 }
11 public static Tunnel CreateTunnel()
12 {
13 return new Tunnel();
14 }
15 public static Jungle CreateJungle()
16 {
17 return new Jungle();
18 }
19 }
调用方式如下:
1 Road road = RoadFactory.CreateRoad();
3 Building building = RoadFactory.CreateBuilding();
4 Tunnel tunnel = RoadFactory.CreateTunnel();
5 Jungle jungle = RoadFactory.CreateJungle();
如上可见简单工厂的问题:
不能应对"不同系列对象"的变化。比如有不同风格的场景---对应不同风格的道路,房屋、地道....
如何解决:
使用面向对象的技术来"封装"变化点。
动机(Motivate):
在软件系统中,经常面临着"一系统相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?
意图(Intent):
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
----《设计模式》GOF
结构图:

-----------以上来自网络--------------
简单的说,工厂返回实例 -- 简单工厂可以通过接口或抽象类返回一个抽象或几个抽象(依靠工厂中的方法) -- 抽象工厂通过对工厂抽象,返回一系统相关联的抽象对象
public interface IRoad //Road对象的接口
{
void Roadmethod();
}
public interface ITree //Tree对象的接口
{
void Treemethod();
}
public class Road1:IRoad
{
public void Roadmethod()
{
//...实现
}
}
public class Road2:IRoad
{
public void Roadmethod()
{
//...实现
}
}
public class Tree1:ITree
{
public void Treemethod()
{
//...实现
}
}
public class Tree2:ITree
{
public void Treemethod()
{
//...实现
}
}
public abstract class ABFactory
{
public static ABFactory GetFactory(string type)
{
//...判断 return ABFactory;
}
public abstract IRoad GetRoad();
public abstract ITree GetTree();
}
public class Factory1:ABFactory
{
public IRoad GetRoad()
{
return new Road1();
}
public ITree GetTree()
{
return new Tree1();
}
}
public class Factory2:ABFactory
{
public IRoad GetRoad()
{
return new Road2();
}
public ITree GetTree()
{
return new Tree2();
}
}
//单纯运用工厂,返回每种实例,则有多少种对象便有多少种方法,牵一发而动全身,当需要另一系统对象时,需要改动所有方法的调用。
// 通过对简单工厂进行传参的话,虽然可以返回接口,接口对实体的关注,但需要对每一个方法关注参数,当参数改变,则所有方法的参数都必需修改.
// 只有通过抽象工厂与对象接口,客户或界面层程序员只需关注抽象工厂中的参数以及返回的接口对象,从而实现了关注接口而不关注具体。即只需要关注抽象工厂所需的参数便中以使用每个方法,实现了代码与参数的最大限度的分离。
//这就是抽象工厂告诉我们的如何最大限度实现面向接口,如何运用OO中的各种原则
1 class RoadFactory
2 {
3 public static Road CreateRoad()
4 {
5 return new Road();
6 }
7 public static Building CreateBuilding()
8 {
9 return new Building();
10 }
11 public static Tunnel CreateTunnel()
12 {
13 return new Tunnel();
14 }
15 public static Jungle CreateJungle()
16 {
17 return new Jungle();
18 }
19 }
调用方式如下:
1 Road road = RoadFactory.CreateRoad();
3 Building building = RoadFactory.CreateBuilding();
4 Tunnel tunnel = RoadFactory.CreateTunnel();
5 Jungle jungle = RoadFactory.CreateJungle();
如上可见简单工厂的问题:
不能应对"不同系列对象"的变化。比如有不同风格的场景---对应不同风格的道路,房屋、地道....
如何解决:
使用面向对象的技术来"封装"变化点。
动机(Motivate):
在软件系统中,经常面临着"一系统相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?
意图(Intent):
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
----《设计模式》GOF
结构图:

-----------以上来自网络--------------
简单的说,工厂返回实例 -- 简单工厂可以通过接口或抽象类返回一个抽象或几个抽象(依靠工厂中的方法) -- 抽象工厂通过对工厂抽象,返回一系统相关联的抽象对象
public interface IRoad //Road对象的接口
{
void Roadmethod();
}
public interface ITree //Tree对象的接口
{
void Treemethod();
}
public class Road1:IRoad
{
public void Roadmethod()
{
//...实现
}
}
public class Road2:IRoad
{
public void Roadmethod()
{
//...实现
}
}
public class Tree1:ITree
{
public void Treemethod()
{
//...实现
}
}
public class Tree2:ITree
{
public void Treemethod()
{
//...实现
}
}
public abstract class ABFactory
{
public static ABFactory GetFactory(string type)
{
//...判断 return ABFactory;
}
public abstract IRoad GetRoad();
public abstract ITree GetTree();
}
public class Factory1:ABFactory
{
public IRoad GetRoad()
{
return new Road1();
}
public ITree GetTree()
{
return new Tree1();
}
}
public class Factory2:ABFactory
{
public IRoad GetRoad()
{
return new Road2();
}
public ITree GetTree()
{
return new Tree2();
}
}
//单纯运用工厂,返回每种实例,则有多少种对象便有多少种方法,牵一发而动全身,当需要另一系统对象时,需要改动所有方法的调用。
// 通过对简单工厂进行传参的话,虽然可以返回接口,接口对实体的关注,但需要对每一个方法关注参数,当参数改变,则所有方法的参数都必需修改.
// 只有通过抽象工厂与对象接口,客户或界面层程序员只需关注抽象工厂中的参数以及返回的接口对象,从而实现了关注接口而不关注具体。即只需要关注抽象工厂所需的参数便中以使用每个方法,实现了代码与参数的最大限度的分离。
//这就是抽象工厂告诉我们的如何最大限度实现面向接口,如何运用OO中的各种原则
Copyright © 2005 奇点中文网--7dit.com
闽ICP备05001292号
闽ICP备05001292号
