抽象工厂模式

设计模式-抽象工厂模式

主宰稳场 提交于 2019-12-03 20:47:07
模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。 为了更清晰的理解工厂方法模式,需要先引入两个概念: 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。 当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。 抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态 抽象工厂模式与工厂模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时

三:java设计模式之工厂模式

眉间皱痕 提交于 2019-12-03 14:02:00
一、工厂模式的作用,为什么要用工厂模式? a.工厂模式是为了解耦:把对象的创建和使用的过程分开。就是Class A 想调用Class B,那么只是调用B的方法,而至于B的实例化,就交给工厂类。 b.工厂模式可以降低代码重复。如果创建B过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。可以把这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的维护。 c.工厂模式可以减少错误,因为工厂管理了对象的创建逻辑,使用者不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。 二、工厂模式的一些适用场景。 对象的创建过程/实例化准备工作很复杂,需要很多初始化参数,查询数据库等。 类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变。 三、简单工厂模式。 创建一个工厂类,在类中通过传入的参数不同创建不同的实体类。有新需求时需要更改工厂类中的代码,违背了开闭原则。 //创建抽象产品类 ,定义具体产品的公共接口; interface ICourse { /** * 录制视频 * @return */ void record(); } //创建具体产品类(继承抽象产品类), 定义生产的具体产品; class JavaCourse implements ICourse { public void

抽象工厂

我的梦境 提交于 2019-12-03 13:25:27
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 介绍 意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 主要解决: 主要解决接口选择的问题。 何时使用: 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。 如何解决: 在一个产品族里面,定义多个产品。 关键代码: 在一个工厂里聚合多个同类产品。 应用实例: 工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OOP 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子

工厂方法模式

為{幸葍}努か 提交于 2019-12-03 10:03:27
工厂方法模式是 简单工厂模式 的进一步抽象和推广,是GoF 设计模式 的一种。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。 工厂方法模式定义 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。 工厂方法模式类图 工厂方法模式包含如下角色: Product:抽象产品 ConcreteProduct:具体产品 Factory:抽象工厂 ConcreteFactory:具体工厂 工厂方法模式优缺点 工厂方法模式优点 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂

《设计模式》之抽象工厂模式

孤者浪人 提交于 2019-12-03 04:26:42
抽象工厂模式 本来不想写这篇文章的,应该是不想写工厂模式,因为基本大家都会,不过今天看到一个老铁的博客,https://www.yuxuan66.com/16 关于抽象模式的实现,写得不错,看了几遍之后,有了点自己的想法,随便再熟悉一下工厂模式,于是就有了这篇文章,主要是抽象工厂,引用下老铁的例子:咖啡工厂做大做强,引入了新的饮品种类:茶、碳酸饮料。中国工厂仅能制作咖啡和茶,美国工厂仅能制作咖啡和碳酸饮料 使用 我这里创建一个抽象工厂,中国工厂和美国工厂继承它。再创建一个饮料接口,实现各种饮料种类。再创建一个提供者,根据具工厂和种类提供对应的产品 创建一个抽象工厂 /** * @program:hope * @author:aodeng * @微信公众号:低调小熊猫 * @create:2018-11-22 14:43 * 抽象工厂 **/ public abstract class AbstractDrinksFactory { /*** * * @param whatYouLike 你喜欢的饮料类型:coffer,tea,sodas... * @return */ public abstract Drink createDrink(String whatYouLike); } 中国工厂和美国工厂继承它 public class

JAVA-基础

早过忘川 提交于 2019-12-03 02:03:17
一、Java 基础   1.JDK 和 JRE 有什么区别?   答:JRE 是 Java Runtime Environment 的缩写,顾名思义是 java 运行时环境,包含了 java 虚 拟机,java 基础类库。是使用 java 语言编写的程序运行所需要的软件环境,是提供给想运行 java 程序的用户使用的,还有所有的 Java 类库的 class 文件,都在 lib 目录下,并且都打包成 了 jar。 Jdk 是 Java Development Kit 的缩写,顾名思义是 java 开发工具包,是程序员使用 java 语言编写 java 程序所需的开发工具包,是提供给程序员使用的。JDK 包含了 JRE,同时还包 含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具:jconsole, jvisualvm 等工具软件,还包含了 java 程序编写所需的文档和 demo 例子程序。 如果你需要运行 java 程序,只需安装 JRE 就可以了。如果你需要编写 java 程序,需要 安装 JDK。   2.== 和 equals 的区别是什么?   答: (1):对于基本类型和引用类型 == 的作用效果是不同的,如下所示: 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同; (2)equals 解读 equals

抽象工厂模式

匿名 (未验证) 提交于 2019-12-03 00:18:01
抽象工厂模式: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。 当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品对象。它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。 我们将实现一个用数据库插入数据的需求,但是可能会用到Sql server 和 Access两种数据库。具体结构如下 从结构图我们可以看到,他和工厂方法模式基本一样,区别在于,抽象工厂模式,提供一个创建 一系列 相关或者相互依赖对象的接口。 优点: 易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这使得改变一个应用的具体工厂变得很容易,只需要改变具体工厂即可使用不同的产品配置。 让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操作实例,产品的具体类名也被具体工厂实现分离,不会出现在代码中 缺点: 如果需求来自于增加功能,我们将会发现,我们需要增加很多的类才得以实现。 工厂模式根据抽象程度的不同分为三种: - 简单工厂模式 (也叫静态工厂模式) - 工厂方法模式 (也叫多形性工厂) - 抽象工厂模式 (也叫工具箱) 参考:《大话设计模式》 实现源码:https://github.com

点读系列《流畅的python》

我只是一个虾纸丫 提交于 2019-12-03 00:13:41
第1章 python数据模型 python的写法是由背后的魔法方法实现的,比如obj[key],解释器实际调用的是obj.__getitem__(key) 作者把魔法方法叫做双下方法,因为有两个下划线 collections.namedtuple可以用来创建只有少数属性但没有方法的对象,比如 beer_card = Card('7', 'diamonds') random.choice和random.sample不一样的地方在于,sample是返回序列,choice是返回元素,当使用sample(list, 1)[0]的时候,不如直接使用choice(list) deck[12::13],是指先抽出索引是12的那张牌,然后每向后数13张牌拿一张 实现了__getitem__让对象变得可迭代了 sorted(deck, key=spades_high) python sorted函数 suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) def spades_high(card): rank_value = FrenchDeck.ranks.index(card.rank) return rank_value * len(suit_values) + suit_values[card.suit]

设计模式(抽象工厂类)

白昼怎懂夜的黑 提交于 2019-12-03 00:05:21
说的直白一点就是比简单工厂类多了一层封装(可能我的措辞不是很严谨,但是我觉得这是最容易理解的解释了) 将好比两套独立生产的子公司有一个父公司, 子公司的创建还是得父公司拍板儿. 首先根据简单工厂的思路 创建出两个简单工厂: 这里就不详细介绍了 直接上代码 Shape接口 public interface Shape { void draw(); } Square 类 public class Square implements Shape { @Override public void draw() { System.out.println("这是ShapeFactory工厂创建的Square类的方法"); } } Rectangle 类 public class Rectangle implements Shape { @Override public void draw() { System.out.println("这是ShapeFactory工厂创建的Rectangle 类的方法"); } } 工厂类 ShapeFactory public class ShapeFactory { public Shape getShape (String type){ if (type == null){ return null; } if (type.equalsIgnoreCase(

简单架构:反射实现抽象工厂+IDAL接口完全独立DAL

匿名 (未验证) 提交于 2019-12-02 23:55:01
一、普通架构中存在的问题 StudentDB数据库,包含一张StudentInfoTB表,结构如下: s_id int primary key identity ( 1 , 1 ), s_name Nvarchar ( 10 ) not null , s_age int check ( s_age > 10 and s_age < 30 ), s_sex bit not null 先来看一下普通的架构的问题所在: 调用关系: dal层代码只是通过SqlHelper简单的操作一下数据库,就不展示了。 StudentInfo的bll层代码,实例化了一个dal层对象,并且每个方法返回对应的方法: private StudentInfoADODal dal = new StudentInfoADODal (); public List < StudentInfoModel > Select () { return dal . Select (); } public int Update ( StudentInfoModel siModel ) { return dal . Update ( siModel ); } public int Delete ( int id ) { return dal . Delete ( id ); } public int Add (