简单工厂模式

简单工厂模式、工厂方法模式以及抽象工厂模式(详解)

放肆的年华 提交于 2019-12-10 08:47:27
1.简单工厂模式 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例,但它不属于 GOF,23 种设计模式(参考资料:http://c.biancheng.net/view/1317.html)。简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。 接下来我们来看代码,还是以课程为例,设有 Java 架构、大数据、人工智能等课程,已经形成了一个生态。我们可以定义一个课程标准 ICourse 接口: public interface ICourse { /** 录制视频 */ public void record ( ) ; } 创建一个 Java 课程的实现 JavaCourse 类: public class JavaCourse implements ICourse { public void record ( ) { System . out . println ( "录制 Java 课程" ) ; } } 客户端调用代码 public static void main ( String [ ] args ) { ICourse course = new JavaCourse ( ) ; course . record ( ) ; } 看上面的代码,父类

小菜学设计模式——抽象工厂模式

北城余情 提交于 2019-12-09 13:48:00
背景 简单工厂、工厂方法模式,接着必须学习抽象工厂模式 1、使用意图 扩展工厂方法模式 2、生活实例 淘宝电影、猫眼电影都能为我们生成当天各种电影票 3、Java 例子(框架、JDK 、JEE) 个人觉得实实在在的根据抽象工厂模式定义的类应该会很少,毕竟不方便扩展,虽然它是一种很了不起的思想。一般都会采用反射机制+抽象工厂完成,比如,JDBC模块,在使用DriverManger.getConnection 这一步之前,必须要先加载驱动,也就是 Class.forname(class);这里指定class,通过这一步就可以创建驱动实例,也就是通过反射和工厂模式为应用注入了对象;Spring 核心之一 IoC 采用的也是反射机制+工厂模式来完成。 4、模式类图 5、模式优点 抽象工厂模式:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们的具体类。 最大的优点是:容易交换产品系列,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,他只需要改变具体工厂即可使用不同的产品配置。 其次,他让具体创建实例过程与客户端分离,客户端是通过他们的抽象接口操作实例,产品的具体类别也被具体工厂实现分离,不出现在客户端代码中。 6、与类似模式比较 我们知道简单工厂模式(静态工厂模式)就是简单的把对象的创建过程移到了工厂当中

案例分析:设计模式与代码的结构特性

半腔热情 提交于 2019-12-08 21:38:41
一、什么是软件设计模式 1、概念   软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 2、作用   使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 3、分类 软件设计模式一般可分为以下几类: (1)创建模式   a. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。   b. 生成器模式( Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。   c. 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。   d. 原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。   e. 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。 (2)结构模式   a. 适配器模式 (Adapter) :将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。   b. 桥接模式(Bridge)

小菜学设计模式——简单工厂模式

萝らか妹 提交于 2019-12-07 21:03:38
背景 很多时候我们不知道客户具体需要执行哪种类型的操作,但是客户会给出我们对应的提示信息,那么我们的程序必须能够根据参数信息进行动态操作,这样的程序才是一个可扩展的程序。简单工厂模式应该是我们最常见的一种设计模式之一,他就是根据客户的意图选择对应的执行类型进行操作,实际上就是根据不同的参数实例化出不同的对象,所以叫做工厂。 1、使用意图 根据参数的不同实例化出对应的类型对象,对于那些需要大量 生成相同父类实例的程序,他可以避免了代码的重复。 2、生活实例 生活处处是例子 3、Java 例子(框架、JDK 、JEE) 曾经写过一个工具类,关于使用iReport生成html、excel、pdf、doc的报表的SDK,客户只需要传入数据和想要的报表类型,我就可以为他生成对应的类型的数据报表。这就是一个典型的简单工厂模式,一个工厂类 ReportFactory,一个总接口,IExport,声明导出方法export,然后,分别实现报表类型的导出方法。 4、模式类图 5、模式优点 个人觉得这个模式,最大的优点就是避免了代码重复,其次,逻辑上比较清晰。其他的优点估计都是缺点了吧,最大的缺点就是:违背了开放封闭原则,当你想要扩展一种类型的时候,不得不修改工厂类的工厂方法。 6、与类似模式比较 暂时还没有深究其他的工厂模式(工厂方法模式、抽象工厂模式),所以,也没什么好计较的。 另外

【转载】设计模式也可以这么简单

烂漫一生 提交于 2019-12-07 18:54:29
一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错的😂😂😂,花了不少心思来写这文章和做图,力求让读者真的能看着简单同时有所收获。 设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four ( GoF ) 的分类了,他们将设计模式分类为 23 种经典的模式,根据用途我们又可以分为三大类,分别为创建型模式、结构型模式和行为型模式。 有一些重要的设计原则在开篇和大家分享下,这些原则将贯通全文: 面向接口编程,而不是面向实现。这个很重要,也是优雅的、可扩展的代码的第一步,这就不需要多说了吧。 职责单一原则。每个类都应该只有一个单一的功能,并且该功能应该由这个类完全封装起来。 对修改关闭,对扩展开放。对修改关闭是说,我们辛辛苦苦加班写出来的代码,该实现的功能和该修复的 bug 都完成了,别人可不能说改就改;对扩展开放就比较好理解了,也就是说在我们写好的代码基础上,很容易实现扩展。 创建型模式比较简单,但是会比较没有意思,结构型和行为型比较有意思。 创建型模式 创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性。但是,在很多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类

简单工厂模式

霸气de小男生 提交于 2019-12-06 13:47:08
简单工厂模式 Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象 ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法 示例1 定义抽象类 public abstract class AbstractCar { public void run() { System.out.println("汽车飞速行驶中..."); } } 定义实现子类 public class Audi extends AbstractCar { @Override public void run() { System.out.println("奥迪汽车飞速行驶中..."); } } public class BMW extends AbstractCar {

第一章-简单工厂模式

╄→гoц情女王★ 提交于 2019-12-06 12:06:07
1.简单加减乘除计算器实现 计算器程序工厂模式UML图 #include<iostream> using namespace std; /*Operation操作类*/ class Operation { private: double a, b; public: Operation() : a(0), b(0) {} void set_a(double ta) { a = ta; } double get_a() { return a; } void set_b(double tb) { b = tb; } double get_b() { return b; } virtual double GetResult() { double result = 0; return result; } }; /*加减乘除类*/ class OperationAdd : public Operation { double GetResult() { double result = 0; result = get_a() + get_b(); return result; } }; class OperationSub : public Operation { double GetResult() { double result = 0; result = get_a() - get_b();

从BWM生产学习工厂模式

微笑、不失礼 提交于 2019-12-06 09:35:30
工厂模式应用非常之广,在 JDK 底层源码以及各大主流框架中随处可见,一般以 Factory 结尾命名的类,比如 Mybatis 中的 SqlSessionFactory , Spring 中的 BeanFactory 等,都是工厂模式的典型代表。 一、简单工厂模式 1.1 概念 简单工厂模式又称为静态工厂模式,属于设计模式中的创建型模式。简单工厂模式通过对外提供一个静态方法来统一为类创建实例,目的是实现类与类之间解耦:客户端不需要知道这个对象是如何被穿创建出来的,只需要调用简单工厂模式的方法来统一创建就可以了,从而明确了各个类的职责。 1.2 示例 简单工厂模式,以生产汽车轮胎为例。 1.2.1 实体类 轮胎通用属性 public class Tire { /** * 通用属性 */ private String common; } 奔驰车轮胎 包含通用属性外还有自己的特有属性 public class TireForBenz extends Tire{ Tire tire; /** * 特有属性 */ private String benz; public TireForBenz() { this.benz = "得到 Benz 轮胎"; } @Override public String toString() { return "["+this.benz +"]"; } }

设计模式——个人理解

这一生的挚爱 提交于 2019-12-06 08:25:43
写在前面 设计模式是基于固定设计场景的一套解决方案,目的是为了完成开闭原则,或者说面向后续的需求变更,以成本最低的改动和测试完成新功能。同时设计模式也是一种程序员之间的交流语言,可以省去很多沟通成本。 在工作的过程中,从最初不知如何使用设计模式,到中间刻意使用设计模式,到今天稍有好转的正确的使用设计模式,踩了许多坑,也有过度设计的时候,为了避免今后在犯同样的错误,所以准备将自己在项目实践的过程中使用过的设计模式记录下来。 设计模式中,有一些实战里用过,有的没用过,没用过的应该是对这个设计方法没有领悟透彻,所以不知道该怎么用。 目前先按照自己的理解记录下来,有更深的领悟会更新。 创建型设计模式 1、工厂方法模式(FactoryMethod) 工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。” 工厂方法模式,是在抽象类中定义创建对象的方法,调用声明创建过程(抽象方法,但创建对象的过程的实现是在实现类中定义。 也就是说,在创建对象时,创建步骤是固定的,但各个步骤的实现是多种多样的,这种情况下可以使用工厂方法。 例如:创建一个电脑主机,需要安装CPU,内存,硬盘,显卡。这个安装步骤是固定的,但是由不同的工厂实现类去实现这几个步骤。 这种父类声明,子类实现的方式有很多,把这种方法用于创建对象,就叫工厂方法

工厂模式--简单工厂模式

我与影子孤独终老i 提交于 2019-12-06 05:22:36
工厂模式用于实现逻辑的封装,并通过公共的接口提供对象的实例化服务,在添加新的类时装修要做少量的修改。 1.简单工厂模式 通过反射机制进行类注册的简单工厂模式 通过反射机制注册产品类对象和实例化 注册产品对象并向每个产品添加newInstance方法,该方法返回与自身类型相同的新实例 //实例对象父类 public class Vehicle { } //vehicle工厂类public class VehichleFactory { // 用map对象保存产品ID及其对应的分类 private static Map<String, Class> registeredProducts = new HashMap<String, Class>(); // 注册vehicle public void registerVehicle(String type,Class vehicleClass) { registeredProducts.put(type, vehicleClass); } //获取vehicle实列对象 public Vehicle createVehicle(String type) throws InstantiationException, IllegalAccessException { Class vehicleClass =