工厂方法模式

设计模式 - 工厂模式

孤者浪人 提交于 2019-11-30 18:07:45
概述 我们都知道 Java 中一共有 23 种设计模式,其中工厂模式分为三种,即:简单工厂模式(不在 23 种设计模式之列)、工厂方法模式和抽象工厂模式;我们平时说的工厂模式,其实大都指工厂方法模式,这种模式是我们平时编码中用的频率最高的一种,在 Spring 源码中就有很多工厂模式的应用,比如 BeanFactory 。 下面依次按照简单工厂模式、工厂方法模式、抽象工厂模式的顺序,依次由浅入深说说这三种模式;文章分别从定义、场景、优缺点也示例进行讲解。 简单工厂模式 定义 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例,简单来说就是, 定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。 场景 简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。总结一下就是: 需要创建的对象较少; 客户端不关心对象的创建过程; 优缺点 优点 实现了对责任的分割,提供了专门的工厂类用于创建对象 缺点 工厂类的职责相对过重,不易于扩展过于复杂的产品结构,不符合开闭原则(可解决) 示例 接下来我们构造一个场景来看看简单工厂模式的应用:现在手机更新换代的比较快,手机厂商每年基本都会在不同时间或者在同一时间发布生产不同型号和配置的手机。

设计模式一:简单设计模式

孤街浪徒 提交于 2019-11-30 15:10:32
简单工厂模式 概念 简单工厂模式属于创建型模式,又叫做静态工厂方法(Static Factory Method)。简单工厂模式是由一个工厂对象决定创建哪一种产品类实例。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为不同工厂模式的一个特殊实现 值得注意的是,简单工厂模式并不属于GOF设计模式之一。但是他说抽象工厂模式,工厂方法模式的基础,并且有广泛得应用 模式结构 组成 从上图中可以看出,简单工厂模式由三部分组成:具体工厂、抽象产品和具体产品 : 工厂类(Creator):这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中,它往往由一个具体的类实现 抽象产品(AbstractProduct):它一般是具体产品继承的父类或者实现的接口。在Java中,由接口或者抽象类实现 具体产品(ConcreteProduct):工厂类所创建的对象就是此角色的实例。在java中 由一个具体的类实现 实例分析 需求:有苹果类和香蕉类,他们都有get方法,通过主函数对它们进行实例化,并调用get方法 方式一:最基本的实例化 Apple.java: public class Apple { /** * 采集苹果 */ public void get()

浅谈abstractfactory抽象工厂模式

丶灬走出姿态 提交于 2019-11-30 13:04:47
一、前言 上次我们学习了Builder模式,用来组装复杂的实例,Builder就是我们盖房子的一块块砖头,钢筋和水泥,以及简单的用法,使用监工将这些元素有机的组合在了一起就能够建造整个建筑了,是监工将这些原材料按照一定的次序和特定的处理流程糅合在一起,这个过程就是组装。而现在我们学习了抽象工厂模式,将关键零件组装成产品。 在此之前,让我们对前面的几种模式做简单的回顾,首先我们学习了 迭代器模式 ,使用了工厂方法创造迭代器,并且完成了元素的内部实现和遍历的分离,因此成为“器”,也算是一种配合,其次我们学习了适配器,有类适配器和对象适配器,这两者只是实现的方式不同,本质是一样的,都是通过在原素材上加入一个适配器使得能够满足现在的需要,一般用在版本之间的兼容上使得新版本的内容能够在旧版本上使用(适配),以及一些复用的时候需要适当的修改(适配)的场合;之后我们学习了 模板模式和工厂模式 ,模板方法的一个特殊实现其实就是工厂方法,模板方法就是通过在父类之中定义职责,然后让子类实现各自的子任务,最后通过父类进行调用,提高了代码的可修改性和可扩展性,工厂方法则是在模板方法的基础上,通过生产产品的方式将框架的实现分离,遵循了高内聚低耦合的原则;在之后我们学习了 单例模式和原型模式 ,单例模式是保证全局关于某个类只有一个对象,在某些多线程或者编码误用的条件下非常重要,原型模式则是实现了对象的深浅拷贝

设计模式之简单工厂模式

帅比萌擦擦* 提交于 2019-11-30 11:28:29
简单工厂模式 重要等级:4星 难度等级:2星 1定义: 简单工厂模式(Simple Factory Pattern)又称为静态工厂方法(Static Factory Method)简单工厂模式是创建型模式不是23种设计模式之一。在简单工厂方法中,可以根据参数的不同返回不通类实例。简单工厂方法直接定义了一个类负责创建其他类的实例,被创建的实例都具有共同的父类。 在工厂方法中代码片段如下 简单工厂方法类 public class ProductMethodFactory { public static void getProductMethod(String type) { if(type.equals("A")) { return new ConcretProductA(); }else if(type.equals("B")) { return new ConcretProductB(); } } } 接口类如下 public interface Product { public void product(); } 产品类如下 public class ConcretProductA extends Product { public void product() { //yyy产品重写 } } public class ConcretProductB extends Product

简单工厂模式、工厂方法模式与抽象工厂模式的区别(转)

喜欢而已 提交于 2019-11-30 10:06:13
虽然看完了《大话设计模式》,但是工厂模式的三种类型之间的差异,理解还不是非常透彻,那么本文就围绕三者间的差异性来阐述各自的优缺点。 简单工厂模式 (Simple Factory) 首先定义一个产品类的共同接口 public interface Product{ //价格 int price(); //产品名 String getName(); } 分别有三个产品ProductA、ProductB、ProductC ,均实现Product接口 ProductA public class ProductA implements Product { @Override public int price() { return 100; } @Override public String getName() { return "ProductA"; } } ProductB public class ProductB implements Product { @Override public int price() { return 200; } @Override public String getName() { return "ProductB"; } } ProductC public class ProductC implements Product { @Override

八、Java设计模式之工厂方法

孤街醉人 提交于 2019-11-30 06:35:16
定义: 抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口 无需指定它们具体的类 类型:创建型 抽象工厂-适用场景: 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现 抽象工厂-优点: 具体产品在应用层代码隔离。无须关心创建细节 将一个系列的产品族统一到一起创建 抽象工厂-缺点: 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口 增加了系统的抽象性和理解难度 注:相同颜色表示一个产品族,相同形状的为一个产品等级结构 来源: https://my.oschina.net/u/3915790/blog/3109396

设计模式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 14:32:52
🚗工厂方法模式 引言:上一篇写的的是 简单工厂模式 ,简单工厂模式只有三个要素(工厂、抽象产品、具体产品),它没有 工厂接口 ,并且得到产品的方法一般是静态的,所以在工厂实现的扩展性上面较差,可以当作工厂模式的简化版。在简单工厂模式中,当增加一个产品子类的时候,还需要在工厂方法的Switch分支中新增一个判断,只做到了对扩展的开放,并没有做到对修改关闭,而这点在工厂方法模式中得到了一定的克服,作为简单工厂模式的升级版,工厂方法模式更适用于复杂一点的创建方法中。 1.何为工厂方法模式❓ 介绍 ​ 工厂方法模式(FACTORY METHOD)是一种常用的类 创建型设计模式 ,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过 依赖注入 以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂、具体工厂、抽象产品、具体产品 。 该模式中包含的角色及其职责:🕺 抽象工厂(Creator)角色: 是工厂方法模式的 核心 ,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。 具体工厂(Concrete Creator)角色: 这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。 抽象产品(Product)角色:

工厂方法模式

99封情书 提交于 2019-11-29 03:26:42
1、工厂方法模式: 定义一个用于创建对象的接口,让之类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 2、题目: 学雷锋,帮社区老人扫地,洗衣服,买米,做好事。 3、UML图: 4、代码示例: 4.1、雷锋相关类: LeiFeng类 package com.aibaiyang.idemo.service.factorymethod; import lombok.Data; /** * @Author zhong guo * @Date 2019/8/30 19:14 * @description 雷锋类 **/ @Data public class LeiFeng { public void sweep(){ System.out.println("扫地"); } public void wash(){ System.out.println("洗衣服"); } public void buyRice(){ System.out.println("买米"); } } View Code Undergraduate类 package com.aibaiyang.idemo.service.factorymethod; /** * @Author zhong guo * @Date 2019/8/30 19:17 * @description 学雷锋的大学生 **/

设计模式之工厂方法

和自甴很熟 提交于 2019-11-28 22:30:38
工厂方法 前面我们学习了简单工厂,发现一个问题就是简单工厂集合了矛盾,为了解决这个问题我们针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品这种设计模式就是工厂方法。 优点:允许系统在不修改具体工厂角色的情况下引进新产品 缺点:由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量 1 public interface IFactory 2 { 3 IRace CreateRace(); 4 } View Code 1 public class HumanFactory : IFactory 2 { 3 public virtual IRace CreateRace() 4 { 5 return new Human(); 6 } 7 } 8 public class HumanFactoryAdvanced: HumanFactory 9 { 10 public override IRace CreateRace() 11 { 12 Console.WriteLine("123"); 13 return new Human(); 14 } 15 } View Code 1 public class NEFactory : IFactory 2 { 3 public IRace CreateRace() 4 { 5