工厂类

设计模式1--创建型模式

*爱你&永不变心* 提交于 2019-11-29 17:15:42
一.前言   面向对象代码经常用到的就是创建对象,   创建型设计模式就是把对象的创建和对象的使用分离开。   在写类的时候使用创建型模式会使得之后获取对象方便。 二.四种创建者模式: 1. 单例模式 理解:一个类只有一个对象,节省了内存,4种可用方法 经常进行创建和销毁的对象,经常用到的重量级对象用单例模式(比如数据源,session工 厂) 构造方法:(每句话都是一小段代码 ) (1).饿汉式2种(静态变量/静态代码块):   类内创建静态对象实例 并提供静态get方法 (即构造器私有化)     静态变量类加载时就执行,所以没有懒加载,     可能造成内存浪费 静态变量类加载相关机制加载一次,保证了线程安全    (2).懒汉式3种:   类内定义静态对象成员变量 并由静态get方法提供对象实例 (instance方法过滤构造方法)      get方法不加锁线程不安全,方法加锁效率低,instance==null内加锁线程不安全      要控制的是单对象,锁资源只 是控制顺序 (3).双重检查(好):   类内定义静态对象成员变量 并由静态get方法提供对象实例 在第一次创建对象时,对类加载器加锁并进行第二次空对象判断 (4).静态内部类方法:     构造器私有化,在内部类中创建静态对象实例,并提供get方 法      利用静态内部类机制,安全高效,推荐使用 ( 5

设计模式—创建型模式

不问归期 提交于 2019-11-29 15:04:57
文章目录 创建型模式 1、工厂模式 1.1、简单工厂模式 1.2、工厂方法模式 1.3、抽象工厂模式 2、单例模式 2.1、懒汉单例模式 2.1.1、非线程安全的懒汉单例模式 2.1.2、线程安全的懒汉单例模式 2.1.3、返回一个reference指向local static对象(非线程安全) 2.2、饿汉单例模式 3、建造者模式 4、原型模式 创建型模式 创建型模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。 优点:程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 1、工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。 1.1、简单工厂模式 主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。使用简单工厂模式,我们只需要知道具体的产品型号就可以创建一个产品。 缺点:工厂类集中了所有产品类的创建逻辑,如果产品量较大,会使得 工厂类变的非常臃肿 。 /* 1、创建一个 Shape 接口和实现 Shape 接口的实体类。 2、定义工厂类 ShapeFactory。 3、使用 ShapeFactory 来获取 Shape 对象

一.简单工厂模式

末鹿安然 提交于 2019-11-29 14:33:08
🏭 简单工厂模式 ​ 引言:设计模式1、2、3篇将会介绍三个工厂模式,分别为简单工厂模式、工厂方法模式和抽象工厂模式,三个工厂模式在实际运用中的频率也很高。 ​ 本篇介绍的是三个工厂模式中最基础的简单工厂模式,但是实际运用中也是最常见的,博客构造大体分为四个部分:第一部分是对设计模式的官方解释,先对我们对设计模式有一个较为正统的了解;第二部分是通过生活中的例子解释,官方的概念都是很抽象的,强行记概念对自己帮助不大,通过例子可以让我们对设计模式有一个更深的印象;第三部分是设计模式的抽象编程,是设计模式的骨架,有了前面的例子,理解这一部分并不难;最后一部分是对本篇所讲的设计模式的使用场景和优缺点总结。 1.何为简单工厂模式❓ 介绍: ​ 简单工厂模式是属于 创建型 模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一 。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 该模式中包含的角色及其职责:🕺 工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。 工厂类 的创建产品类的方法可以被外界直接调用,创建所需的产品对象。 抽象产品(Product)角色 简单工厂模式所创建的所有对象的 父类

设计模式复习

荒凉一梦 提交于 2019-11-29 06:53:54
设计模式六大原则 开闭原则 :对扩展开放,对修改关闭。即在不修改一个软件实体的基础上去扩展其他功能。 里氏代换原则 :在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。 依赖倒转原则 :针对于接口编程,依赖于抽象而不依赖于具体。 接口隔离原则 :使用多个隔离的接口取代一个统一的接口。降低类与类之间的耦合度。 迪米特法则 (最少知道原则):一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 合成复用原则 :在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系 J2ee常见设计模式,总共23种 创建型模式 (工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式) 结构型模式 (适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式) 行为型模式 (策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式) 创建型模式 (工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式) 结构型模式 (适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式) 行为型模式 (策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式) 常见的设计模式应用: 1

简单工厂模式(静态工厂模式)

╄→гoц情女王★ 提交于 2019-11-29 06:28:33
优点: 将对象的创建与使用分离,将对象的创建交给工厂类负责 客户端无需知道具体产品类的类名,只需要知道所要创建的产品类的对应参数,然后通过工厂获取 缺点: 工厂类集中了所有产品类的创建逻辑,职责过重,一旦有问题影响整个系统 如果需要引入新的产品逻辑,需要修改工厂类的创建逻辑,不符合“开闭原则” 1.创建抽象产品类 public abstract class Product { } 2.创建具体产品类A和B public class ProductA extends Product{ } public class ProductB extends Product { } 3.创建静态工厂 public class StaticFactory { public static Product createProduct(String type) { Product product = null; switch (type) { case "A": product = new ProductA(); break; case "B": product = new ProductB(); break; } return product; } } 4.测试 public class Test { public static void main(String[] args) { /

Java中多If else优化 (三)----工厂+策略模式优化

时光毁灭记忆、已成空白 提交于 2019-11-28 21:05:24
看到一篇用工厂+策略模式优化 多If else的文章,感觉非常不错,文章地址如下: 代码重构:用工厂+策略模式优化过多的if else代码块 文章中利用工厂和策略模式对多个if else 语句进行了优化,其思路: 1、定义一个处罚的接口,包含一个执行处罚的方法 2、每一种情况的处罚都抽象成一个具体处罚类并继承处罚接口(策略模式) 3、定义一个静态工厂类,用来根据情况生产具体处罚对象,然后执行处罚的方法(静态工厂模式)。 其中具体处罚类中除了继承处罚接口外,还实现了InitializingBean接口,在具体处罚类的afterPropertiesSet方法中,将自身注册到静态工厂类的Map<String, 处罚接口>中。优缺点如作者所言, 重构后的处罚逻辑简单、清晰,后续新增一种情况,只需定义一个相应的类即可,根本不需要修改处罚逻辑,完全解耦合,这大大提高了代码的可读性和可维护性。 不过,运用静态工厂+策略模式,也存在弊端,那就是会增加很多类;但是,当每种情况的逻辑代码很多、很复杂的时候,那么这个弊端就可以忽略不计,其优势就完全展示出来了。 工作项目中也有用到类似方式实现不同数据的处理,但与文章中示例方式略有不同: 文章示例中定义一个静态工厂类,业务类统一接口和各具体业务类,由具体业务类实现InitializingBean接口,具体业务类初始化时,将自身注册到静态工厂类中的Map

谈谈对spring的理解(自用)

橙三吉。 提交于 2019-11-28 13:38:48
1.spring的工作原理 spring 是按照设计模式精心打造的,它实现了工厂模式的工厂类,这个类名为BeanFactory(接口),在程序中通常使用它的子类ApplicationContext(也是接口)。 spring的核心是IOC(反转控制)容器,IOC也是一种编程思想,用于实现模块之间的解耦,在Spring中它的作用是对对象的创建,维护和销毁等生命周期的控制。IOC:把对象的创建、初始化、销毁交给spring来管理,而不是由开发者控制,实现控制反转。 spring是一个大的工厂类,spring的特点就是基于配置,在其配置文件中通过<bean>元素来创建实例对象。 根据业务逻辑来看,对象经常不是独立的,一个对象的创建往往涉及另一个对象的创建,当然这个对象也要由 IOC容器负责,负责的方式就是依赖注入DI,通过反射机制实现。有三种注入方式:(1)接口注入(2)构造器注入(3)Setter方法注入。 2.spring的核心技术 spring的核心技术有:IOC,AOP java 的 高级特性:反射机制,代理 AOP:面向切面编程,系统中有很多各不相干的类的方法,在这众多方法中加入某种系统功能的代码,如加入日志,权限判断等,AOP可以实现横切关注点(如日志,安全,缓存和事务管理)与他们所影响的对象之间的解耦。 实现 AOP 功能采用的是代理技术,调用代理类

设计模式-简单工厂模式详解

半城伤御伤魂 提交于 2019-11-28 11:41:46
一、简单工厂模式的概念   简单工厂模式是属于创建型设计模式,关注于对象的创建。   我们来考虑一个支付的场景,在点外卖的时候,可以使用选择支付宝、微信支付、ApplePay等支付方式。   这些支付方式虽然名字不一样,但是用法和流程基本类似,都包括了验证账号的合法性、检查支付环境的安全性、验证支付密码、从账号里扣款、通知用户支付结果等功能。   有共性,我们就抽象出一个基类,然后各种支付方式子类继承它,再实现自己的业务逻辑。   如果我们希望在使用这些支付方式时,不需要知道这些具体支付方式子类的名字,只需要知道支付方式名字,把该名字传入一个方法即可返回一个相应的对象,此时,就可以使用简单工厂模式。 二、实现   1、首先定义一个各种支付方式的抽象类,简单起见,定义了判断账号是否正常、支付、通知用户几个方法 namespace SimpleFactory { using System; public abstract class AbstractPaymentMethod { /// <summary> /// 判断用户的账号是否正常 /// </summary> /// <param name="accountNumber">账号</param> /// <returns>账号是否正常</returns> public abstract bool IsAccountNormal

java设计模式----工厂模式

依然范特西╮ 提交于 2019-11-27 23:50:28
软件设计的要点是高内聚低耦合,而工厂模式则满足了这个要求,工厂模式分为三种:简单工厂模式(静态工厂类),工厂方法模式,抽象工厂模式。先上代码 简单工厂模式 1)工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。 2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。 3)具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 新建一个接口: package factory; public interface Interface { public void operate(); } 再建两个实现类: package factory; public class Impl implements Interface{ @Override public void operate() { System.out.println("实现接口方法"); } } package factory; public class Impl1 implements Interface{ @Override public void operate() { System.out.println("Impl1实现接口方法"); } } 工厂类: package factory; /** * 工厂方法 *

关于quartz定期,起服务时不新增配置文件中的定期问题

帅比萌擦擦* 提交于 2019-11-27 20:48:11
关于quartz定期,起服务时不新增配置文件中的定期问题 问题原因:生产环境中起服务,未加载配置文件信息,且quartz连接超时 查找原因发现 由于别人新建了一个定期文件 并将 quartz工厂类的id于之前文件的id命名成相同导致加载的时候 由于单例的原因不能加载另一个配置文件 正确的配置: 可将多个定期配置到同一个文件中 用同一个 quartz工厂类 或者将 quartz工厂类 的id名称成不同的名称 <bean id="xxxjob" class="org.springframework.scheduling.quartz.JobDetailBean"> <!--调用的类 --> <property name="jobClass" value="com.cvicse.hrzcyp.flow.InfoSubmitProjectMessageTimingFlow"> </property> <property name="jobDataAsMap"> <map> <entry key="timeout" value="0"/> </map> </property> </bean> <!-- 定时任务-押品信息报送 --> <bean id="xxx" class="org.springframework.scheduling.quartz.CronTriggerBean">