常规的对象创建方法:

//创建一个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模式主要在于应对"新系列"的需求变动。其缺点在于难以应对”新对象“的需求变动。
Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。

转载于:https://www.cnblogs.com/1285026182YUAN/p/5144670.html

2.抽象工厂(Abstract Factory)相关推荐

  1. 设计模式学习笔记——抽象工厂(Abstract Factory)模式

    设计模式学习笔记--抽象工厂(Abstract Factory)模式 @(设计模式)[设计模式, 设计模式中文名, 设计模式英文名] 设计模式学习笔记抽象工厂Abstract Factory模式 基本 ...

  2. 设计模式--抽象工厂(Abstract Factory)模式

    模式定义 提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类 类图 应用场景 程序需要处理不同系列的相关产品,但是你不希望它依赖于这些产品的具体类时可以使用抽象工厂模式 优点 1.可以 ...

  3. [设计模式-创建型]抽象工厂(Abstract Factory)

    概括 名称 Abstract Factory 结构 动机 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...

  4. C2:抽象工厂 Abstract Factory

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现.提供一种"封装机制"来避免客户程序和这种"多系列具 ...

  5. c++设计模式--抽象工厂(abstract factory)

    一.原理讲解 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 1.1意图 定义一个创建对象的接口,让子类决定实例化哪个类.该模式使类对象的创建延迟到子类. 1.2应用场景 一个 ...

  6. 《研磨设计模式》chap7 抽象工厂 Abstract Factory

    场景:配电脑,多种CPU.主板 1. 正常编码 1.1 cpu //CPU的接口 public interface CPUApi {//示意方法,CPU具有运算的功能 public void calc ...

  7. 设计模式 抽象工厂(Abstract Factory Pattern)

    抽象工厂模式,比工厂模式具有更高层次的抽象.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以使用这种模式.换句话说,抽象工厂是一个工厂对象,他能返回一系列相关类中的一个类.可 ...

  8. 设计模式 - 抽象工厂模式(abstract factory pattern) 详解

    抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/270916 ...

  9. 『创建型』简单工厂SimpleFactory、工厂方法FactoryMethod、抽象工厂AbstractFactory

    为什么80%的码农都做不了架构师?>>>    几点说明 永远不要纠结于在什么时候使用什么模式 永远不要纠结于什么模式适用于什么情景 永远不要去死记任何的模式 并不是说,23种设计模 ...

  10. 抽象工厂+反射=反射工厂

    在我的上一篇文章(疑惑?改良?从简单工厂到工厂方法)中,详细论述了创建模式中简单工厂到工厂方法的演变过程,并试图结合工厂方法的设计以及.net中的反射机制之所长,改良出一种新型的工厂-反射工厂,这当然 ...

最新文章

  1. 多媒体计算机技术在教学中的应用,【浅谈多媒体计算机技术在中学物理教学中的应用】计算机技术是什么...
  2. 各计算机语言之父,四大编程语言之父
  3. java读写文件大全
  4. OpenCV消除傅立叶域中的周期性噪声的实例(附完整代码)
  5. java main 命令行_java Main 命令行
  6. OpenCV3学习(11.5) FAST特征检测器FastFeatureDetector
  7. MATLAB 生成exe 的几种方法
  8. 海康威视mp4html播放器,videoJS 网页视频播放器支持MP4
  9. kail linux暴力破解wifi
  10. c语言编程实现合取析取,C++实现离散数学求主合取范式和主析取范式
  11. js去掉字符串第一位和最后一位
  12. 几款常见的可视化HTML编辑器 WYSIWYG
  13. 浙江大学翁恺C++自学笔记
  14. 设计解谜游戏的30堂课
  15. Discuz!您当前的访问请求当中含有非法字符,已经被系统拒绝解决办法
  16. XML Schema学习札记(1)——基础总览
  17. OpenCV从摄像头中检测人脸
  18. Qt之QLCDNumber
  19. android speex AEC 回音消除
  20. 21点:赌场里最可能赢钱的游戏

热门文章

  1. 听飞狐聊JavaScript设计模式系列11
  2. 长沙戴维营教育iOS开发面试题周刊
  3. 确保移动设备的安全:在保护数据的同时提高工作效率
  4. npm run build 出错 npm: 6.5.0-next.0 should be = 3.0.0
  5. 蓝桥杯 ADV-234 算法提高 字符串跳步
  6. 蓝桥杯 ADV-14 算法提高 卡勒沃夫之弱水路三千(提高型)
  7. [Java] 蓝桥杯ALGO-11 算法训练 瓷砖铺放
  8. L2-027 名人堂与代金券-PAT团体程序设计天梯赛GPLT
  9. Docker与容器安全
  10. 虚拟无线接入网:行业的演进方向