关键词排名优化网站,网站建设腾讯云与阿里云,德州手机网站建设服务,国外网站建设素材常规的对象创建方法#xff1a;
//创建一个Road对象 Road road new Road();
new 的问题#xff1a; 实现依赖#xff0c;不能应对“具体实例化类型”的变化。解决思路#xff1a; 封装变化点-----哪里变化#xff0c;封装哪里 潜台词#xff1a; 如果没有变…常规的对象创建方法
//创建一个Road对象 Road road new Road();
new 的问题 实现依赖不能应对“具体实例化类型”的变化。解决思路 封装变化点-----哪里变化封装哪里 潜台词 如果没有变化当然不需要额外的封装工厂模式的缘起 变化点在“对象创建”因此就封装“对象创建” 面向接口编程----依赖接口而非依赖实现最简单的解决方法
1 class RoadFactory{ 2 public static Road CreateRoad() 3 { 4 return new Road(); 5 } 6 } 7 //创建一个Road对象 8 Road roadroadFactory.CreateRoad();
创建一系列相互依赖对象的创建工作 假设一个游戏开场景 我们需要构造道路、房屋、地道从林...等等对象工厂方法如下 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结构图Struct): 适用性 1.一个系统要独立于它的产品的创建、组合和表示时。 2.一个系统要由多个产品系统中的一个来配置时。 3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。 4.当你提供一个产品类库而只想显示它们的接口不是实现时。生活例子 结构图代码实现
1 abstract class AbstractFactory 2 { 3 public abstract AbstractProductA CreateProductA(); 4 public abstract AbstractProductB CreateProductB(); 5 } 1 abstract class AbstractProductA 2 { 3 public abstract void Interact(AbstractProductB b); 4 } 1 abstract class AbstractProductB 2 { 3 public abstract void Interact(AbstractProductA a); 4 } 1 class Client 2 { 3 private AbstractProductA AbstractProductA; 4 private AbstractProductB AbstractProductB; 5 public Client(AbstractFactory factory) 6 { 7 AbstractProductA factory.CreateProductA(); 8 AbstractProductB factory.CreateProductB(); 9 } 10 public void Run() 11 { 12 AbstractProductB.Interact(AbstractProductA); 13 AbstractProductA.Interact(AbstractProductB); 14 } 15 } 1 class ConcreteFactory1:AbstractFactory 2 { 3 public override AbstractProductA CreateProductA() 4 { 5 return new ProductA1(); 6 } 7 public override AbstractProductB CreateProductB() 8 { 9 return new ProductB1(); 10 } 11 } 1 class ConcreteFactory2:AbstractFactory 2 { 3 public override AbstractProductA CreateProductA() 4 { 5 return new ProdcutA2(); 6 } 7 public override AbstractProductB CreateProductB() 8 { 9 return new ProductB2(); 10 } 11 } 1 class ProductA1:AbstractProductA 2 { 3 public override void Interact(AbstractProductB b) 4 { 5 Console.WriteLine(this.GetType().Name interact with b.GetType().Name); 6 } 7 } 1 class ProductB1:AbstractProductB 2 { 3 public override void Interact(AbstractProductA a) 4 { 5 Console.WriteLine(this.GetType().Name interact with a.GetType().Name); 6 } 7 } 1 class ProdcutA2:AbstractProductA 2 { 3 public override void Interact(AbstractProductB b) 4 { 5 Console.WriteLine(this.GetType().Name interact with b.GetType().Name); 6 } 7 } 1 class ProductB2:AbstractProductB 2 { 3 public override void Interact(AbstractProductA a) 4 { 5 Console.WriteLine(this.GetType().Name interact with a.GetType().Name); 6 } 7 } 1 public static void Main() 2 { 3 // Abstractfactory1 4 AbstractFactory factory1 new ConcreteFactory1(); 5 Client c1 new Client(factory1); 6 c1.Run(); 7 // Abstractfactory2 8 AbstractFactory factory2 new ConcreteFactory2(); 9 Client c2 new Client(factory2); 10 c2.Run(); 11 }
Abstract Factory注意的几点 如果不存在”多系列对象创建“的需求变化则没必要应用Abstract Factory模式静态工厂方法足矣。 系列对象指的是这些对象之间有相互依赖、或作用的关系。例如游戏开发场景中的道路与房屋依赖“道路”与“地道”的依赖。Abstract Factory模式主要在于应对新系列的需求变动。其缺点在于难以应对”新对象“的需求变动。Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。
分类: 设计模式, 1.首页原创精华.NET区
好文要顶 关注我 收藏该文
王晓成关注 - 1粉丝 - 108
加关注
1
0
« 上一篇 单件模式(Singleton Pattern) » 下一篇 建造者模式(Builder)
posted on 2007-08-29 17:25 王晓成 阅读(15809) 评论(3) 编辑 收藏 Feedback
#1楼 2008-05-21 09:08 xingxi
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 } 此段代码中Building、Road 等是在何处定义的啊 谢谢给予明示
支持(0) 反对(0) #2楼 2008-07-08 01:57 21212
--引用-------------------------------------------------- xingxi: 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 } 此段代码中Building、Road 等是在何处定义的啊谢谢给予明示 -------------------------------------------------------- 这还用定义吗这篇文章说的是一种设计模式不是教你定义类。