2.抽象工厂(Abstract Factory)
常规的对象创建方法:
//创建一个Road对象 Road road =new Road();
new 的问题:
实现依赖,不能应对“具体实例化类型”的变化。
解决思路:
封装变化点-----哪里变化,封装哪里
潜台词: 如果没有变化,当然不需要额外的封装!
工厂模式的缘起
变化点在“对象创建”,因此就封装“对象创建”
面向接口编程----依赖接口,而非依赖实现
最简单的解决方法:
class RoadFactory{public static Road CreateRoad(){ return new Road(); }} //创建一个Road对象Road road=roadFactory.CreateRoad();
创建一系列相互依赖对象的创建工作:
假设一个游戏开场景:
我们需要构造"道路"、"房屋"、"地道","从林"...等等对象
工厂方法如下:
class RoadFactory{public static Road CreateRoad(){return new Road();}public static Building CreateBuilding(){return new Building();}public static Tunnel CreateTunnel(){return new Tunnel();}public static Jungle CreateJungle(){return new Jungle();}}
调用方式如下:
Road road = RoadFactory.CreateRoad();Building building = RoadFactory.CreateBuilding();Tunnel tunnel = RoadFactory.CreateTunnel();Jungle jungle = RoadFactory.CreateJungle();
如上可见简单工厂的问题:
不能应对"不同系列对象"的变化。比如有不同风格的场景---对应不同风格的道路,房屋、地道....
如何解决:
使用面向对象的技术来"封装"变化点。
动机(Motivate):
在软件系统中,经常面临着"一系统相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?
意图(Intent):
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
----《设计模式》GOF
结构图(Struct):
适用性:
1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系统中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们的接口不是实现时。
生活例子:
结构图代码实现:
public abstract class AbstractFactory{public abstract AbstractProductA CreateProductA();public abstract AbstractProductB CreateProductB();}
public class ConcreteFactory1 : AbstractFactory{public override AbstractProductA CreateProductA(){return new ProductA1();}public override AbstractProductB CreateProductB(){return new ProductB1();}}
public class ConcreteFactory2 : AbstractFactory{public override AbstractProductA CreateProductA(){return new ProductA2();}public override AbstractProductB CreateProductB(){return new ProductB2();}}
public abstract class AbstractProductA{public abstract void Interact(AbstractProductB b);}
public class ProductA1 : AbstractProductA{public override void Interact(AbstractProductB b){Console.WriteLine(this.GetType().Name + "interact with " + b.GetType().Name);}}
public class ProductA2 : AbstractProductA{public override void Interact(AbstractProductB b){Console.WriteLine(this.GetType().Name + "interact with " + b.GetType().Name);}}
public abstract class AbstractProductB{public abstract void Interact(AbstractProductA a);}
public class ProductB1 : AbstractProductB{public override void Interact(AbstractProductA a){Console.WriteLine(this.GetType().Name + " interact with " + a.GetType().Name);}}
public class ProductB2 : AbstractProductB{public override void Interact(AbstractProductA a){Console.WriteLine(this.GetType().Name + " interact with " + a.GetType().Name);}}
public class Client{private AbstractProductA AbstractProductA;private AbstractProductB AbstractProductB;public Client(AbstractFactory factory){AbstractProductA = factory.CreateProductA();AbstractProductB = factory.CreateProductB();}public void Run(){AbstractProductA.Interact(AbstractProductB);AbstractProductB.Interact(AbstractProductA);}}
public static void Main(){// Abstractfactory1AbstractFactory factory1 = new ConcreteFactory1();Client c1 = new Client(factory1);c1.Run();//Abstractfactory1AbstractFactory factory2 = new ConcreteFactory2();Client c2 = new Client(factory2);c2.Run();}
如果不存在”多系列对象创建“的需求变化,则没必要应用Abstract Factory模式,静态工厂方法足矣。
"系列对象"指的是这些对象之间有相互依赖、或作用的关系。例如游戏开发场景中的"道路"与"房屋"依赖,“道路”与“地道”的依赖。
Abstract Factory模式主要在于应对"新系列"的需求变动。其缺点在于难以应对”新对象“的需求变动。
Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。
转载于:https://www.cnblogs.com/1285026182YUAN/p/5144670.html
2.抽象工厂(Abstract Factory)相关推荐
- 设计模式学习笔记——抽象工厂(Abstract Factory)模式
设计模式学习笔记--抽象工厂(Abstract Factory)模式 @(设计模式)[设计模式, 设计模式中文名, 设计模式英文名] 设计模式学习笔记抽象工厂Abstract Factory模式 基本 ...
- 设计模式--抽象工厂(Abstract Factory)模式
模式定义 提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类 类图 应用场景 程序需要处理不同系列的相关产品,但是你不希望它依赖于这些产品的具体类时可以使用抽象工厂模式 优点 1.可以 ...
- [设计模式-创建型]抽象工厂(Abstract Factory)
概括 名称 Abstract Factory 结构 动机 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...
- C2:抽象工厂 Abstract Factory
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现.提供一种"封装机制"来避免客户程序和这种"多系列具 ...
- c++设计模式--抽象工厂(abstract factory)
一.原理讲解 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 1.1意图 定义一个创建对象的接口,让子类决定实例化哪个类.该模式使类对象的创建延迟到子类. 1.2应用场景 一个 ...
- 《研磨设计模式》chap7 抽象工厂 Abstract Factory
场景:配电脑,多种CPU.主板 1. 正常编码 1.1 cpu //CPU的接口 public interface CPUApi {//示意方法,CPU具有运算的功能 public void calc ...
- 设计模式 抽象工厂(Abstract Factory Pattern)
抽象工厂模式,比工厂模式具有更高层次的抽象.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以使用这种模式.换句话说,抽象工厂是一个工厂对象,他能返回一系列相关类中的一个类.可 ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 详解
抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/270916 ...
- 『创建型』简单工厂SimpleFactory、工厂方法FactoryMethod、抽象工厂AbstractFactory
为什么80%的码农都做不了架构师?>>> 几点说明 永远不要纠结于在什么时候使用什么模式 永远不要纠结于什么模式适用于什么情景 永远不要去死记任何的模式 并不是说,23种设计模 ...
- 抽象工厂+反射=反射工厂
在我的上一篇文章(疑惑?改良?从简单工厂到工厂方法)中,详细论述了创建模式中简单工厂到工厂方法的演变过程,并试图结合工厂方法的设计以及.net中的反射机制之所长,改良出一种新型的工厂-反射工厂,这当然 ...
最新文章
- 多媒体计算机技术在教学中的应用,【浅谈多媒体计算机技术在中学物理教学中的应用】计算机技术是什么...
- 各计算机语言之父,四大编程语言之父
- java读写文件大全
- OpenCV消除傅立叶域中的周期性噪声的实例(附完整代码)
- java main 命令行_java Main 命令行
- OpenCV3学习(11.5) FAST特征检测器FastFeatureDetector
- MATLAB 生成exe 的几种方法
- 海康威视mp4html播放器,videoJS 网页视频播放器支持MP4
- kail linux暴力破解wifi
- c语言编程实现合取析取,C++实现离散数学求主合取范式和主析取范式
- js去掉字符串第一位和最后一位
- 几款常见的可视化HTML编辑器 WYSIWYG
- 浙江大学翁恺C++自学笔记
- 设计解谜游戏的30堂课
- Discuz!您当前的访问请求当中含有非法字符,已经被系统拒绝解决办法
- XML Schema学习札记(1)——基础总览
- OpenCV从摄像头中检测人脸
- Qt之QLCDNumber
- android speex AEC 回音消除
- 21点:赌场里最可能赢钱的游戏
热门文章
- 听飞狐聊JavaScript设计模式系列11
- 长沙戴维营教育iOS开发面试题周刊
- 确保移动设备的安全:在保护数据的同时提高工作效率
- npm run build 出错 npm: 6.5.0-next.0 should be = 3.0.0
- 蓝桥杯 ADV-234 算法提高 字符串跳步
- 蓝桥杯 ADV-14 算法提高 卡勒沃夫之弱水路三千(提高型)
- [Java] 蓝桥杯ALGO-11 算法训练 瓷砖铺放
- L2-027 名人堂与代金券-PAT团体程序设计天梯赛GPLT
- Docker与容器安全
- 虚拟无线接入网:行业的演进方向