工厂类

面向接口编程与注入理解

狂风中的少年 提交于 2020-03-08 04:21:29
在JAVA中类与对象是常见的两个名词。通常,人们喜欢把类比喻为蓝图,而对象比喻为用蓝图生成的产品。这样的比喻是有一定的缺陷的,因为当两个类有协作关系时,通常的做法是在其中一个类中生成另一个类的对象,然后再调用这个对象的方法完成相应的组合功能。如果套用蓝图与产品,我们就会发现,一种产品居然在另一产品的图纸中产生。这样的视觉效果让人产生迷惑。此时设计模式或者框架来解决了这个问题。在工厂模式中,类的对象的生成不再是随处,而是固定在一个工厂类中。通过工厂类,可以很方便生成想要的对象,同时又不会混淆图纸与产品的关系,虽然产品是在工厂图纸,也就是工厂类中生成,但也比通常的做法要好很多。spring框架也是利用了工厂模式的原理来达到减少复杂度的目的,通过把spring的配置,所有的类,也就是产品类都会被注册到bean 工厂中,当需要使用的时候只需要从工厂容器中取出相应名称的对象即可。当开始使用工厂,也就是不在图纸上面建造依赖类,那么依赖关系如何继续呢?通过接口继续这种依赖关系。一个类依赖了一个接口,意味这个类可以在自己的方法中使用所有接口中定义的方法,同时也意味着这个类可以接纳所有实现了这个接口的类的进入,或者说是注入。而实现了接口,意味着它可以被当成这个接口看待,可以注入到依赖这个接口的类中。这就是面向接口编程与DI的实际意义。 来源: CSDN 作者: 奈树 链接: https://blog

设计模式-常用之一

扶醉桌前 提交于 2020-03-06 16:40:27
一.工厂模式 定义: Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 用途:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 个人理解:普通工厂模式相当于一个专卖品商店,提供一种类产品的创建,你想要的产品,商店就会提供给你。例如:这是一个面包专卖店, 那么你只能在这里买到面包,你只需要给商店打一声招呼,老板来一块面包,你就会得到你想要的面包(类对象),如果你想买到其他的产 品,商店就需要扩展业务,比如引进牛奶,饮料之类的, 但是扩展业务会带来相应的负担。 官方配图: 代码演示: 1.Bread接口 2.定义红色面包类,并实现Bread接口 3.定义黑色面包类,并实现Bread接口 4.定义工厂类,BreadFactory 5.实例化工厂类,并选着要被制造出来的类 二.抽象工厂模式 定义:是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 用途

工厂模式

拥有回忆 提交于 2020-03-04 00:06:49
例子1:开发一个类似植物大战僵尸的游戏,有三种不同的植物:绿豆,蓝冰,坚果   分析:可以使用简单工厂模式:因为每个植物都需使用new()方法创建实例,所以我们将所以不同的植物实现一个名叫植物的接口,然后在在工厂类中判断所需创建的植物,若要创建指定的植物只需调用工厂类中的createPlant方法即可 package org.imooc.factory; import org.imooc.component.Arms; import org.imooc.component.Hair; import org.imooc.component.Shell; import org.imooc.plant.*; public class SimpleFactory { /** * 创建植物对象的静态方法 */ public static Plant createPlant(String name) { Plant plant = null; if(PlantNameConstant.BEAN_NAME.equals(name)) { plant = new Bean(); } else if (PlantNameConstant.ICE_NAME.equals(name)) { plant = new Ice(); } else if (PlantNameConstant.WALL_NAME

设计模式-11享元模式(Flyweight Pattern)

孤街醉人 提交于 2020-03-03 15:49:33
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量 相同或相似 对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。 享元模式就是把 相同或相似 对象的公共部分提取出来变为共享的,而不同的部分为对象私有的。这样设计无疑增加了程序的复杂性。 2.模式定义 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式。 属于 对象结构型模式 。 享元模式的理念: 享元模式通过共享技术实现相同或相似对象的重用。 在享元模式中可以共享的相同内容称为内部状态(IntrinsicState),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。 在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)用于存储具有相同内部状态的享元对象。 享元模式的目的就是使用共享技术来实现大量细粒度对象的复用。 3.模式结构 享元模式的主要角色有如下: 抽象享元角色

设计模式

十年热恋 提交于 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 18:15:14
简单工厂模式是工厂模式的一种最简单的形式,该模式可以根据消费者的需求,生产固定的几种产品,且将生产产品(创建对象的行为逻辑隐藏起来) 我们举个简单的例子来说明: 上图是IDEA导出来的图片,我们有一个 Phone 的抽象接口 然后有很多具体的实现类,比如: Honor 。 有一个Phone的工厂类 PhoneFactory ,当用户想要手机的时候,调用工厂类的ProducePhone方法,可以根据手机品牌名称生产对应的手机。 接下来我们看代码: Phone接口: public interface Phone { ​ String getName (); } 荣耀手机: public class Honor implements Phone { ​ @Override public String getName () { return "荣耀" ; } } 华为手机: public class HuaWei implements Phone { @Override public String getName () { return "华为" ; } } 小米手机: public class Mi implements Phone { @Override public String getName () { return "小米" ; } } Oppo手机: public class

05设计模式

血红的双手。 提交于 2020-02-25 18:59:49
/*--> */ /*--> */ /*--> */ /*--> */ /*--> */ /*--> */ /*--> */ /*--> */ 1.单例模式   确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。 In [3]: class User: def __init__(self, name, password): self.name = name self.password = password In [4]: u1 = User("zs", "123") u2 = User("ls", "456") print(u1 == u2) #==判断表达式如果返回True,这两个对象是一个对象,并且内存地址相同 print("u1对象的内存地址:%s,u2对象的内存地址:%s" % (id(u1), id(u2))) False u1对象的内存地址:201311512,u2对象的内存地址:201310952   以上结果可以看出,执行结果为False,是不同的对象。 In [7]: # 伪单例模式 class User: __instance = None def __init__(self, name, password): self.name = name self.password = password

设计模式(工厂模式)

两盒软妹~` 提交于 2020-02-25 18:56:16
一、什么是设计模式 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而不必做重复劳动。” 每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。 GoF(Gang of Four) 设计模式四个基本要素:模式名称、问题、解决方案、效果 二、设计模式七大原则 1、开放封闭原则:一个软件实体如类,模块和函数应该对扩展是开放的,对修改是关闭的。即软件实体应尽量在不修改原有代码的情况下进行扩展(装饰器) 2、里氏替换原则:重写父类里面的方法,逻辑可能不一样,但是返回的结果参数啥的要一样(所有引用基类的地方必须能透明的使用其子类的对象) 3、依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象,要针对接口编程,而不是针对实现编程。(接口类) 4、接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要实现的接口 5、迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用 6、单一职责原则:一个类只负责一项职责(不要存在多于一个导致类变更的原因,即一个类只负责一项职责) 7、合同复用原则:多用组合少用继承 一个类重用另一个类的代码有两种方式 继承 组合 a、下面来说一下接口隔离原则 接口隔离原则 #假如说现在有这样的动物类 from abc import

设计模式-工厂模式

回眸只為那壹抹淺笑 提交于 2020-02-23 16:00:09
工厂模式  当我们创建一个对象比较复杂时且客户端不关心于实例对象的创建过程时我们可以用工厂模式 类型: 简单工厂模式 工厂方法模式 抽象工厂模式 简单工厂模式 百度百科 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现 下面我们来举一个例子: 比如我们一个手机可能有苹果、华为、小米这些品牌的手机,手机里面又有很多零件,如果当一个手机的类定义是这样的 public class Mobile implements IMobile{ ​ //CPU private String cpu; //内存 private String memory; //显示屏 private String display; ​ ​ public Mobile(String cpu, String memory, String display) { this.cpu = cpu; this.memory = memory; this.display = display; } public void show() { System.out.println(this.getDisplay()