工厂模式

Spring工厂模式+单例实现解耦

大憨熊 提交于 2020-03-09 04:41:35
1。BeanFactory 实现解决三层架构new之间的依赖 package bean; import org.springframework.beans.factory.BeanFactory; import javax.xml.ws.soap.Addressing; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class FactoryBean { //定义一个Properties private static Properties prop; //定义一个Map,存放所创建的对象 private static Map<String ,Object> beans; //使用静态代码块 static{ try { //1.实例化对象 prop=new Properties(); //2.获取流对象 InputStream in= BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"); prop

工厂模式

ぐ巨炮叔叔 提交于 2020-03-09 02:43:35
一、工厂模式的由来 二、简单工厂模式 例子:创建一个ICourse课程接口: 创建一个JavaCourse实现类: 创建一个PythonCourse实现类: 创建一个CourseFactory类,用来生成JavaCourse或PythonCourse对象: 创建一个SimpleFactoryTest测试类,来看客户端调用: 类关系结构图: 1、简单工厂模式(Simple Factory Pattern):指由一个工厂对象决定创建出哪一种产品类的实例。(属于创建型模式,但它不属于GOF(四位作者)的23种设计模式之一) 2、目的:减少代码冗余程度,提高代码的复用性。 3、适用场景 工厂类负责创建的对象较少 客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心 4、优点:只需传入一个正确的参数,就可以获取你所需要的对象,无需知道其创建的细节。 5、缺点 工厂类的职责相对过重,增加新的产品时,如果产品存在差异化的逻辑,则需要修改工厂类的判断逻辑,违背开闭原则 不易于扩展过于复杂的产品结构 三、工厂方法模式 (简单工厂模式的升级版) 例子:创建一个ICourseFactory接口,也可以是抽象类(超级工厂): 创建一个JavaCourseFactory工厂实现类,用来生成JavaCourse对象: 创建一个JavaCourseFactory工厂实现类

设计模式-常用之一

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

创建型模式--工厂模式

橙三吉。 提交于 2020-03-06 10:33:05
工厂模式   工厂模式(Factory Pattern)是Java 中最常用的设计模式之一。提供了一种创建对象大的最佳方式。我们在创建对象时不会对客户端暴露创建逻辑,通过一个共同的接口来指向新创建的对象。   介绍    意图 :定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。    主要解决 :接口选择的问题。    何时使用 :不同条件下创建不同实例时。    如何解决 :让其子类实现工厂接口,返回的也是一个抽象的产品。   应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。   优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。   缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。    使用场景 : 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库

设计模式之工厂模式(Factory Pattern)

久未见 提交于 2020-03-04 21:18:21
工厂模式分为:简单工厂模式,工厂方法模式,抽象工厂模式 简单工厂模式: 简单工厂模式分离产品的创建者和消费者,有利于软件系统结构的优化;但是由于一切逻辑都集中在一个工厂类中,导致了没有很高的内聚性,同时也违背了“开放封闭原则”。另外,简单工厂模式的方法一般都是静态的,而静态工厂方法是无法让子类继承的,因此,简单工厂模式无法形成基于基类的继承树结构。 示例代码: public class FoodFactory { public static Food getFood(String type){ try { if("MC".equals(type.toUpperCase())){ return McChicken.class.newInstance(); }else if("CHIP".equals(type.toUpperCase())){ return Chips.class.newInstance(); }else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } public static Food getFood(Class<? extends Food> foodClass){ try { if(McChicken.class.equals(foodClass)){

4-工厂模式、通信套接字

橙三吉。 提交于 2020-03-04 07:47:17
1. 工厂模式 什么是简单工厂模式? 答:使用一个单独的类来做创建势力的过程,就是工厂。比如: (1)有两个类: class RequestCodec : public Codec 和 class RespondCodec : public Codec ,两个类都继承抽象类 class Codec ; (2)若要创建两个类的对象时,需要直接调用该类的构造函数; (3)但若使用工厂模式,可以直接创建工厂类的对象,通过调用工厂类中已经实现好的成员函数,根据传参不同来创建两个类的对象; (4)通过工厂模式创建的两个类的对象是Codec类型对象,但由于多态,因此可以直接当作子类对象来使用。 简单工厂模式实现与使用? //1. 两个类继承抽象类Codec class RequestCodec : public Codec class RespondCodec : public Codec //2.创建工厂类 class BaseFactory { public : BaseFactory ( ) { } ~ BaseFactory ( ) { } //2.1通过成员函数创建两个类的对象 Codec * createCodec ( int flag ) { Codec * c = NULL ; //根据传参不同,分别创建不同的类对象 if ( flag == 1 ) /

工厂模式之简单工厂

梦想与她 提交于 2020-03-04 07:23:15
1. 引入   简单工厂的本质是,工厂根据传入的参数,动态的决定应该使用哪一个产品(产品是接口的具体实现)。其中涉及三类角色:   (1)工厂角色。负责创建所有实例。工厂类中创建产品类的方法可以被外界直接调用,创建所需的产品对象。   (2)抽象产品角色。简单工厂模式所创建的所有对象的父类,负责描述所有实例共有的公共接口。   (3)具体产品角色。是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。  2. 场景实现   场景描述:使用c#、java、c、VB任意一种语言实现一个计算器控制台应用程序,要求输入两个数和运算符号,得到结果。 2.1 代码实现 class Program { static void Main(string[] args) { Console.WriteLine("请输入数字1"); string num1 = Console.ReadLine(); Console.WriteLine("请输入数字2"); string num2 = Console.ReadLine(); Console.WriteLine("请输入运算符号"); string sysbol = Console.ReadLine(); string result = ""; switch (sysbol) { case "+":result = Convert

工厂模式

拥有回忆 提交于 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.模式结构 享元模式的主要角色有如下: 抽象享元角色

MyBatis配置文件(七)--environments运行环境

大兔子大兔子 提交于 2020-03-01 12:26:02
一、environments配置信息: environments的作用是用来配置数据库信息,可以配置多个,其有两个可配的子元素,分别是:事务管理器transactionManager和数据源dataSource,先看一下我配置的例子: 1 <!-- 环境模式:development开发模式 work工作模式 --> 2 <environments default="development"> 3 <!--环境变量 --> 4 <environment id="development"> 5 <!--事务管理器 --> 6 <transactionManager type="JDBC" /> 7 <!--数据源 --> 8 <dataSource type="POOLED"> 9 <property name="driver" value="${db.driver}" /> 10 <property name="url" value="${db.url}" /> 11 <property name="username" value="${db.username}" /> 12 <property name="password" value="${db.pwd}" /> 13 </dataSource> 14 </environment> 15 </environments>