抽象工厂模式

设计模式:抽象工厂模式

不问归期 提交于 2019-11-27 15:56:58
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则, 所以,从设计角度考虑,有一定的问题,如何解决? 就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解。 抽象工厂模式(Abstract Factory Pattern)是围绕一个 超级工厂创建其他工厂 。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 接口: public interface Sender { public void send(); } public interface Provider { public Sender produce(); } 实现类: public class MailSender implements Sender{ @Override public void send() { System.out.println("this is mailsender..."); } } public class SmsSender

IoC模式

你离开我真会死。 提交于 2019-11-27 14:24:15
1.依赖 依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖。如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它。下面看一个简单的示例: /// <summary> /// 用户播放媒体文件 /// </summary> public class OperationMain { public void PlayMedia() { MediaFile _mtype = new MediaFile(); Player _player = new Player(); _player.Play(_mtype); } } /// <summary> /// 播放器 /// </summary> public class Player { public void Play(MediaFile file) { Console.WriteLine(file.FilePath); } } /// <summary> /// 媒体文件 /// </summary> public class MediaFile { public string FilePath { get; set; } } 上面是一个用户用播放器播放文件简单示例,用户操作是OperationMain类中的PlayMedia方法,打开一个播放器

【C++】--抽象工厂模式

只谈情不闲聊 提交于 2019-11-27 03:39:40
本文借鉴Java大佬的 设计模式 ,灰常厉害的大佬 简单工厂模式---> https://blog.csdn.net/aby_byy/article/details/99328126 工厂模式---> https://blog.csdn.net/aby_byy/article/details/99329071 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品。 A类、B类(抽象产品) 它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法 A1、A2、B1、B2类(具体产品) 它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。 AbstractFactor类(抽象工厂) 它声明了一组用于创建一族产品的方法createA()、createB(),每一个方法对应一种产品。 D1、D2(具体工厂) 它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。 比如生产 15.6的电脑 ,那么就得是15.6的显示屏 15.6的外壳 始终是同一个产品族的对象! 抽象工厂模式实现:

设计模式之创建类模式PK

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-27 00:36:12
创建类模式包括: 工厂方法模式 建造者模式 抽象工厂模式 单例模式 原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新的对象,这两个不容易混淆. 工厂方法模式VS建造者模式 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步的精确构造创建出一个复杂的对象. 工厂方法模式和建造者模式的区别: 意图不同. 在工厂方法模式中, 我们关注的是产品的整体,无需关心产品的各部分是如何创建出来的; 但是在建造者模式中,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是"由零件一步一步地组装出产品对象". 简单地说, 工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象,关注的是产品组成部分的创建过程. 产品的复杂度不同. 工厂方法模式创建的产品一般都是单一性质产品,而建造者模式创建的则是一个复合产品,它由各个部件复合而成,不见不同产品对象当然不同. 在具体应用中如何选择呢?这取决于我们在做系统设计时的意图, 如果需要详细关注一个产品不见的生产、安装步骤,则选择建造者 ,否则选择工厂方法模式 抽象工厂模式VS建造者模式 抽象工厂模式实现对产品家族的创建, 一个产品家族是这样一系列产品:

第519篇--DesignPattern (Abstract Factory 1)

喜夏-厌秋 提交于 2019-11-26 21:34:25
意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 场景 还是上次说的那个网络游戏,定下来是一个休闲的FPS游戏。和CS差不多,8到16个玩家在游戏里面分成2组对战射击。现在要实现初始化场景的工作。要呈现一个三维物体一般两个元素是少不了的,一是这个物体的骨架,也就是模型,二就是这个骨架上填充的纹理。 我们知道,这样的一个游戏不可能只有一张地图,而且地图的数量肯定是会一直增加的。如果游戏在初始化场景的时候需要根据不同的地图分别加载模型和纹理对象,那么势必就会使得场景的扩充变得很不方便。由此,我们引入Abstract Factory,抽象工厂生产的都是实际类型的接口(或者抽象类型),如果加了新的场景可以确保不需要修改加载场景的那部分代码。 using System; using System.Reflection; using System.Data.Common; namespace AbstractFactoryExample { class Program { static void Main1( string [] args) { Patrix patrix = new Patrix(); patrix.LoadScene( " HalfPaper " ); patrix.LoadScene( " Matrix " ); } } /// <summary

设计模式2——Factory设计模式

孤街浪徒 提交于 2019-11-26 21:24:36
Factory工厂设计模式为创建对象提供了一种抽象,而对使用者屏蔽了对象创建的具体细节过程,工厂模式有三种:简单工厂模式,抽象工厂模式和工厂方法模式。 1. 简单工厂模式: 又叫静态工厂模式,简单工厂只包括一个抽象产品类(该类可以是接口,也可以是具体的类),所有需要的产品类都是该抽象产品类的子类。简单工厂模式中工厂为具体产品工厂,产品为抽象产品,由工厂实例创建产品实例: 一个生成圆形和矩形的图形工厂,例子如下: //图形接口 interface Shape(){ public void draw(); } //圆形 class Circle implements Shape{ public void draw(){ System.out.println(“Circle is drawing”); } } //矩形 class Rectangle implements Shape{ public void draw(){ System.out.println(“Rectangle is drawing”); } } //图形工厂 class ShapeFactory{ public static Shape createShape(String name) throws InstantiationException, IllegalAccessException,

23种设计模式(3):抽象工厂模式

女生的网名这么多〃 提交于 2019-11-26 21:24:24
定义: 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。 类型: 创建类模式 类图: 抽象工厂模式与工厂方法模式的区别 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。 在抽象工厂模式中,有一个 产品族 的概念:所谓的产品族,是指 位于不同产品等级结构中功能相关联的产品组成的家族 。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依然拿生产汽车的例子来说明他们之间的区别。 在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品族。再具体一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于另一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于另一个产品族。 明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了

设计模式之二抽象工厂设计模式

不打扰是莪最后的温柔 提交于 2019-11-26 21:16:07
继上篇简单工厂设计模式之后,今天继续讲解抽象工厂设计模式。在简单工厂中,我们的工厂类一次只可以处理一类产品。那么如果我们想处理多类产品,简单工厂是满足不了的。必须要用抽象工厂设计模式。 我们先从概念上来了解下什么是抽象工厂设计模式: •1、提供一系列相互依赖对象的创建工作 •2、封装对象常规的创建方法(new) •3、提供统一调用访问方法的方式 •4、避免调用访问方法和具体对象创建工作的紧耦合 这些概念性的东西看起来比较抽象,直接上图 如上图所示,我们如何去更好的理解抽象工厂,首先 我们要分清在这个模式中的几类角色。有抽象工厂,实体工厂,抽象产品,实体产品,客户(调用代码的类)。 •抽象工厂设计模式中各个对象的主要功能、职责: •1、用抽象工厂生产抽象产品 •2、用实体工厂生产实体产品 •3、用抽象产品提供实体产品访问接口 •4、用实体产品实现自己的功能 直接上代码: 1、定义抽象产品 (父类可以是接口或者抽象类,我们定义一个抽象类,一个接口) 定义抽象产品A: /// <summary> /// 抽象产品A /// </summary> public abstract class Car { public abstract void Run(); } 抽象产品B: /// <summary> /// 抽象产品B /// </summary> public interface

IoC模式(依赖、依赖倒置、依赖注入、控制反转)

女生的网名这么多〃 提交于 2019-11-26 19:35:11
1.依赖 依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖。如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它。下面看一个简单的示例: /// <summary> /// 用户播放媒体文件 /// </summary> public class OperationMain { public void PlayMedia() { MediaFile _mtype = new MediaFile(); Player _player = new Player(); _player.Play(_mtype); } } /// <summary> /// 播放器 /// </summary> public class Player { public void Play(MediaFile file) { Console.WriteLine(file.FilePath); } } /// <summary> /// 媒体文件 /// </summary> public class MediaFile { public string FilePath { get; set; } } 上面是一个用户用播放器播放文件简单示例,用户操作是OperationMain类中的PlayMedia方法,打开一个播放器

你还在看错误的抽象工厂模式实现案例?

核能气质少年 提交于 2019-11-26 13:09:42
昨天在搜抽象工厂模式时,发现有好几篇博文讲的实现方式和我所认知的有出入,而且还看到某某教程讲的也是错误的还在搜索引擎排第一。 大家讲的简单工厂模式和工厂方法模式都是没问题的,关键到抽象工厂模式就不对了。 先从简单工厂模式和工厂方法模式复习一下,然后再看看错的是咋讲的。已经对抽象工厂模式烂熟于心的请忽略此文。 简单工厂模式: 有个一公共的产品接口,定义一些方法,各个具体的产品类都实现这个接口,然后有一个专门生产产品类实例的类被称作工厂类,专门为客户端生产产品实例,这个工厂的内部实现就是使用switch或ifelse进行逻辑判断实现的,根据客户端传递的参数不同,来决定什么时候创建什么样的具体产品,生产出不同的具体产品返回给客户端。这样,这个工厂类就集成了所有产品的创建逻辑,它变得无所不知,这也让它变成了核心。但这也成为了他的缺点,因为它将所有的逻辑集中放在一个类里,当产品接口有了新的产品实现类,工厂类需要增加代码,判断在什么时候创建该产品,就需要加入新的判断逻辑。 ShoesFactory工厂 public class ShoesFactory{ public static final String NIKE = "NIKE"; public static final String ADIDAS = "ADIDAS"; public static Shoes getShoes