抽象工厂模式

6. 掌管对象的生命周期,工厂

匆匆过客 提交于 2020-03-01 10:44:56
自定义的公寓树 大雄不想做作业了,想逃离父母管教,拥有自己的公寓的时候,哆啦A梦给他一颗公寓树,满足了这个想法。公寓树可以根据自己的需要向土里延申,创建出运动房、餐厅、书房。当胖虎、静香、阿福过来了,又满足了他们的想法,创建出棒球场、钢琴室、游戏室。 这颗树洞就像我们的房间工厂,他不用去知道到底需要创建什么内容,他构造出一个一个内容,由需要的人进行装修设计,摆放自己的家具,他只要满足开放一个门,以便与房间互通规则。 应用与反思 星空里的单据也是这样的,通过动态领域模型抽象出来的实体,我不管对应的对象到底是基础资料(物料、供应商、客户、销售员),还是单据(采购订单、销售订单),还是报表,他们统一都是有MVC组成,抽象的控制器C,抽象视图V以及我们已经存在的抽象实体。 工厂就是我们不得不说的名词了,它有两点基本要求: 原子的,因为要保证创建对象或者Aggregate的所有固定规则,Factory创建的对象都要处于一致的状态; 工厂应当被抽象为所需的类型,而不是具体类。 创建型的设计模式 是我们常用的方式,有的时候还可以用构造函数,是一种实现策略,当然有的时候增加接口,是为了我们能耦合参数。 重建对象 回归到工厂构建对象,我们不但在新建对象的时候需要使用到工厂,在从持久化的内容中,重建对象的时候,应当满足下面要求, 不分配新的ID,也就是继续使用旧对象持久化的唯一标识

设计模式

十年热恋 提交于 2020-02-29 18:41:53
目录 一.python中的对象(类)和接口 1.对象/类 2.接口 3.python中接口的两种写法 写法一 写法二 二.设计模式六大原则 三.设计模式分类 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 4.单例模式 5.创建型模式小结 6.适配器模式 7.代理模式 8.责任链模式 9.观察者模式 10.策略模式 一.python中的对象(类)和接口 1.对象/类 三大特征: 封装, 继承, 多态 封装: 将方法封装或属性到一个类中 继承: 子类可以继承父类的方法和属性 多态: python动态语言, 天生就是多态的, python中没有非多态的方法. 所以不用考虑python中的多态具体是如何体现出来的 2.接口 概述: 接口是一种特殊的类, 该类中声明了若干方法, 要求继承了该接口的类必须实现这些方法. 作用: 限制 继承接口的 类的 方法名称和调用方式; 隐藏了类的内部实现. 接口就是一种抽象的基类(父类), 限制继承它的类必须实现接口中定义的某些方法. 3.python中接口的两种写法 写法一 class Interface: def method(self, arg): raise NotImplementedError 写法二 from abc import abstractmethod, ABCMeta class Interface(metaclass

设计模式实战---抽象工厂模式(Abstract-Factory-Pattern)

蓝咒 提交于 2020-02-27 08:40:37
0 导读 工厂方法模式人是造出来了,可都是清一色的类型,缺少关爱、仇恨、喜怒哀乐等情绪,人类的生命太平淡了,忘记给人类定义性别了,那怎么办? 从头开始建立所有的事物也是不可能的,那就想在现有的条件下重新造人,尽可能旧物利用嘛 人种(Product产品类)应该怎么改造呢?怎么才能让人类有爱有恨呢?定义互斥的性别,然后在每个个体中埋下一颗种子:异性相吸,成熟后就一定会去找个异性 从设计角度来看,一个具体的对象通过两个坐标就可以确定:肤色和性别 产品类分析完,生产的工厂类(八卦炉)该怎么改造呢? 只有一个生产设备,要么生产出来的全都是男性,要么都是女性,何以解忧? 把目前已经有的生产设备—八卦炉拆开,于是女娲就使用了“八卦复制术”,把原先的八卦炉一个变两个,并且略加修改,就成了女性八卦炉(只生产女性人种)和男性八卦炉(只生产男性人种),于是就开始准备生产 一个接口,多个抽象类,然后是N个实现类,每个人种都是一个抽象类,性别是在各个实现类中实现的 特别需要说明的是 HumanFactory 接口,在这个接口中定义了三个方法,分别用来生产三个不同肤色的人种,也就是我们在坐标图的Y坐标,它的两个实现类分别是性别,也就是坐标图的X坐标 通过X坐标(性别)和Y坐标(肤色)唯一确定了一个生产出来的对象 Human接口如代码 人种有三个抽象类,负责人种的抽象属性定义 肤色和语言,白色人种、黑色人种

设计模式前传——学习设计模式你要先知道这些

喜夏-厌秋 提交于 2020-02-26 13:34:05
为什么要学设计模式? 面试经常被问到 以前总觉得设计模式是“花拳绣腿”,实际开发中没什么卵用,其实有好多种设计模式自己在无形中就使用了,只是自己不知道 设计模式是软件开发人员的“标准词汇”,学习设计模式是个人技术能力提高的捷径 设计模式包含了面向对象的精髓,“懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要” 软件设计模式概述 软件设计模式的产生背景 “设计模式”这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1987 年,肯特·贝克(Kent Beck)和沃德·坎宁安(Ward Cunningham)首先将建筑领域的模式思想应用在 Smalltalk 中的图形用户接口的生成中,但没有引起软件界的关注。 1994 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书,在本教程中收录了 23 个设计模式,这是设计模式领域里程碑的事件,导致了软件设计模式的突破。这 4 位作者在软件开发领域里也以他们的“四人组”(Gang of Four,

面向对象之接口与抽象性

三世轮回 提交于 2020-02-23 13:58:12
一、接口(interface)   1、 定义 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要...则必须能...”的思想。继承是一个"是不是"的关系,而接口实现则是 "能不能"的关系 接口的本质是契约,标准,规范,就像我们的法律一样。制定好后大家都要遵守 一个类可以实现多个接口,可以得到多重继承的效果   2、接口的使用说明(JDK7及以前) ① Java中,接口(interface) 是与类(class)并列的结构 ② 如何定义一个接口:使用interface关键字 ③ 接口中只能定义全局常量和抽象方法 全局常量:public static final的,但是书写时,可以省略不写         抽象方法:public abstract修饰         ④ 接口中不能定义构造器,意味着接口不可以实例化。         ⑤ Java开发中,接口通过让类去实现(implements)的方式来使用 类实现接口以后,就获取了接口中声明的结构:常量、抽象方法 如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化         如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类          ⑥ Java类可以实现多个接口 弥补了Java单继承性的局限性 格式:class AA extends BB implements CC,DD,EE

浅析设计模式

一个人想着一个人 提交于 2020-02-22 00:11:46
  一、什么是设计模式?   设计模式,是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。   使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。   Christopher Alexander对设计模式这样说:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而不必做重复劳动。”   设计模式四个基本要素: 模式名称; 问题; 解决方案; 效果。   二、对类的回顾   类和对象的三大特性: 封装 继承 多态   关于特性,就不做赘述了。我们先要了解 接口 这个概念。什么是接口?   接口:一种特殊的类,声明了若干方法,要求继承该接口的类必须实现这些方法。   接口就是一种抽象的基类(父类),限制继承它的类必须实现接口中定义的某些方法。   接口的作用:限制继承接口的类的方法的名称及调用方式;隐藏了类的内部实现。   Python中关于接口的两种写法: # 写法一: class InterFace(object): def method(self,arg): raise NotImplementedError #

[导入]关于PHP接口的学习

我与影子孤独终老i 提交于 2020-02-17 18:41:00
最近学习PHP5接口的过程中遇到了困难 ,书中说是实现多重继承的一种方式,但我依然不知道具体该如何实现。在网上查PHP接口的资料很少,就查了java的,其实基本上都差不多。看完《澄清Java(接口与继承)》这篇文章才恍然大悟,原来我一开始理解就有误,所谓的多重继承是指接口继承类,而不是类继承接口。 文章中提到了OO的抽象,正如文章中的那句话——"抽象就是抽去像的部分",很形象,以前想到抽象总是认为很难理解,抽象嘛,哈哈,现在就很容易理解了,这也正是接口和抽象类所要做的事情。 文章中还有很多观点也让我受益匪浅,罗列如下: OO的精髓,我以为,是对对象的抽象。 接口的作用,一言以蔽之,就是标志类的类别(type of class)。把不同类型的类归于不同的接口,可以更好的管理他们。 继承的意义也在于抽象,而不是代码重用。 看完这篇文章,现在基本上理解接口、抽象类、继承该如何应用了。 原文如下: 澄清Java(接口与继承) 计算机学院研二的兄弟与我讨论Java,一见面,几个问题全是关于接口,接口有什么用?为什么要用接口?什么时候该使用接口?很庆幸他们不是问我 Java如何连接SQL Server,或者是如何开发J2EE应用,这类问题有杀伤力,避之则吉。今年计算机学院本科有个毕业设计课题是做J2ME,选这个题目的学生在5月末都 还在苦着脸研究java.util.*这个包,这个这个……唉。

抽象工厂模式

坚强是说给别人听的谎言 提交于 2020-02-17 11:28:40
前面我们介绍了简单工厂模式和工厂方法模式,现在简单的回顾一下: 简单工厂模式是充分利用面向对象的三大特性,将操作要素和操作方法对象化,通过定义工厂方法,决定实例化哪个对象。但简单工厂模式不利于程序的扩展,在需要扩展的时候需要将整个工程类开放,不符合开放-封闭原则。 在简单工厂模式的基础上,我们通过继承接口实现个操作对象的实例化,各具体操作类各自实现相应的方法,只需实现工厂类接口方法即可,在对功能进行扩展时,不需要对工厂类接口进行修改,只需新增操作类和实例化自己的工厂类即可。 那我们为什么需要抽象工厂模式呢? 当我们项目的数据库需要从sqlserver改成oracle时,当初用抽象工厂模式设计的优点就体现出来了。 抽象工厂模式:创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 以数据访问为例: 1 interface IUser 2 { 3 void Insert(User user); 4 5 User GetUser(int id); 6 } 1 class SqlserverUser : IUser 2 { 3 public void Insert(User user) 4 { 5 Console.WriteLine("在Sqlserver中给User表增加一条记录"); 6 } 7 8 public User GetUser(int id) 9 { 10

抽象工厂模式

瘦欲@ 提交于 2020-02-17 11:27:47
抽象工厂模式(Abstract Factory),提供一个创建 一系列 相关或相互依赖的接口,而无需指定它们具体的类。 涉及到多个产品系列的问题,工厂方法模式组合叫抽象工厂模式。如下图涉及到大于1个的产品,Oracle、mysql两个产品。应用的具体工厂是由两种不同的数据库实现,可以很方便的切换两个数据库的访问的代码。 只是涉及到一个产品系列问题,才叫工厂方法模式。如下图 只涉及Leifeng这一产品 抽象工厂模式代码展示开始 Department类 package abstractFactory.dept; public class Department { private long id; private String deptName; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } } IDeptDao接口类 package abstractFactory.dept; public interface IDeptDao {

【设计模式】抽象工厂模式

吃可爱长大的小学妹 提交于 2020-02-15 05:28:29
package com . depthmind . designpattern ; import java . sql . Connection ; public class AbstractFactoryPattern { public static void main ( String [ ] args ) { IDatabaseUtils iDatabaseUtils = new OracleDatabaseUtils ( ) ; IConnection connection = iDatabaseUtils . getConnection ( ) ; connection . connect ( ) ; ICommand command = iDatabaseUtils . getCommand ( ) ; command . command ( ) ; } } interface IConnection { void connect ( ) ; } class MysqlConnection implements IConnection { @Override public void connect ( ) { System . out . println ( "mysql connect complete!!!!" ) ; } } class