工厂模式

简单工厂、工厂模式和抽象工厂

允我心安 提交于 2019-12-22 03:15:25
  工厂可以分为三种:简单工厂、工厂模式和抽象工厂,三者的关系是递进的,以做包子为例,刚开始只有两种包子:豆腐包和牛肉包,可以使用简单工厂(或者叫静态工厂)来解决,随着包子种类的越来越多,发现没添加一种包子,就需要改工厂类,扩展性太差,因此出现了工厂模式,提取一个公共的做包子接口,然后针对每一种包子建一个工厂类来专门生产这种包子,随后店面扩大,开始卖豆浆了,豆浆是不能在包子工厂里生产的,因此这时候就需要提取一个公共的既可以做包子又可以做豆浆的接口,然后每一个工厂去实现这个接口,这样每个工厂就都可以既生产包子又生产豆浆,只是种类不同,这就是抽象工厂。工厂方法和抽象工厂的最大区别在于工厂模式是用来创建同一个产品的不同类型的,但是抽象工厂模式是用来创建不同类的产品。   下面给出三种模式的类图和简单代码   1、简单工厂   类图   结构非常简单,定义一个包子接口,两个具体实现类,再有一个工厂负责根据名字生产不同的包子。可以看出,简单工厂扩展性非常差,例如我们要生产青菜包,则需要去修改工程类,违背了开闭原则。代码如下 package simpleFactory; public interface BaoZi { void method(); } package simpleFactory; public class DouFuBao implements BaoZi {

工厂模式+单例模式

大城市里の小女人 提交于 2019-12-22 00:45:46
工厂的三种模式:目的都是解耦 简单工厂 工厂是一个类:生产各种各样产品;不同类实现接口;业务全部在fractory中,违反了开闭原则。 使用在业务简单的情况下。 工厂方法 (如果工厂的产品全部属于同一个等级结构,则属于工厂方法。) 定义一个创建对象的工厂接口,让子类决定实例化哪一个类,将实际工作交给子类 例子: 工厂是一个接口,produceTrunk() ,实现创建不同卡车类 卡车也是一个接口,实现不同卡车类 将不同卡车的业务逻辑抽离出fractory 优点 符合开闭原则,每增加一种产品,只需要增加相应具体的产品类和工厂子类。 符合单一职责原则,每个具体工厂类只负责创建对应的产品。 缺点 在增加一个新产品时,需要增加一个产品类和一个具体的子工厂,每个工厂生产一种产品,太过单一。 抽象工厂 (如果工厂的产品来自多个等级结构,则属于抽象工厂模式) 抽象工厂角色:具体工厂必须时间的接口。 具体工厂角色:和具体业务逻辑相关的代码,创建对应的具体产品的对象。 抽象工厂:producetrunk(); producesedan(); 具体工厂:宝马工厂(宝马轿车、宝马卡车)奥迪工厂(奥迪轿车、奥迪卡车) 抽象产品:卡车、轿车 具体产品:宝马卡车,宝马轿车,奥迪卡车,奥迪轿车 单例模式 概念:包含一个被称为单例的特殊类。 特点:单例类只能有一个实例;单例类必须自己创建自己的唯一实例

GOF23设计模式之工厂模式(factory)

ぐ巨炮叔叔 提交于 2019-12-22 00:10:11
一、工厂模式概述   实现了创建者和调用者的分离   (1)分类     ①简单工厂模式       虽然某种程度不符合设计原则,但实际使用最多。     ②工厂方法模式       不修改已有类的前提下,通过增加新的工厂类实现扩展。     ③抽象工厂模式       不可以增加产品,可以增加产品族。 二、不使用工厂模式时   1.创建一个汽车的接口 1 public interface Car { 2 void run(); 3 }   2.创建两个实现汽车接口的类: 1 public class Audi implements Car { 2 3 public void run() { 4 System.out.println("奥迪在跑..."); 5 } 6 7 } 1 public class Byd implements Car { 2 3 public void run() { 4 System.out.println("比亚迪在跑..."); 5 } 6 7 }   3.客户端创建实例: 1 public class Client { 2 3 public static void main(String[] args) { 4 Car c1 = new Audi(); 5 Car c2 = new Byd(); 6 7 c1.run(); 8 c2.run();

设计模式

邮差的信 提交于 2019-12-20 19:56:30
参考 一、单例 私有构造方法,对外提供获取实例的方法 懒汉式 线程安全(性能)/线程不安全 饿汉式 线程安全 懒汉式 双重校验锁 (volatile保证指令不重排) 静态内部类 ( 静态内部类加载时机 ) 二、工厂模式 简单工厂模式 由工厂统一实例化,增加的中间过程可以统一插入其他操作;但是不符合开闭原则,添加产品需要添加修改工厂方法 工厂模式 符合开闭原则,将实例化延迟到子工厂,添加产品需要添加子工厂及其具体产品类 抽象工厂模式 ?? 来源: CSDN 作者: huqianhqa 链接: https://blog.csdn.net/huqianhqa/article/details/103631177

5种创建型设计模式

早过忘川 提交于 2019-12-19 04:13:01
创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 工厂方法模式 工厂模式重点就在“工厂”二字,理解工厂,就理解了工厂模式(工厂方法与抽象工厂模式) 简单工厂模式 概念 这种模式又叫静态工厂方法模式。它是通过将创建对象的过程交给一个类,由这个类来创建对象,这个类就是工厂。而被创建的实例通常都具有共同的父类。这里的实例我们叫它产品。 之所以叫静态工厂是因为工厂类是写死的,所有的创建对象都在这个类中添加。(若不理解,可以比较下面的工厂方法模式一起理解) 组成部分 接口:放着各个产品类的共有的功能 产品类:实现接口,重写方法 工厂类(核心):负责创建对象,也可以实现相关的逻辑 实现代码 //下面的代码应该是多个文件,这里全部写在一起了,如果想测试注意分开建立文件 //接口:电脑组件 public interface ComputerPart { void getPart ( ) ; } //键盘类 public class KeyBoard implements ComputerPart { @Override public void getPart ( ) { System . out . println ( "买到键盘了" ) ; } } //显示器类 public class Screen implements ComputerPart { @Override

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

孤者浪人 提交于 2019-12-18 03:45:02
概述 设计模式 :设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。 设计模式的特点 :设计模式可以增强我们的代码的可读性,增强我们代码的可维护性,可以充分的实现我们的代码复用的原则。 我选择的是 工厂模式, 工厂设计模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 对于简单工厂模式, 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工厂方法模式中是一个子类对应一个工厂类,而这些工厂类都实现于一个抽象接口。这相当于是把原本会因为业务代码而庞大的简单工厂类,拆分成了一个个的工厂类,这样代码就不会都耦合在同一个类里了。 结构如下所示: 下面是一个实例结构图及分析 1)首先定义 1)首先定义一个工厂接口 import org.zero01.operation.Operation; public interface Factory { public Operation

工厂模式Factory(创建模式)

独自空忆成欢 提交于 2019-12-16 09:13:07
定义 提供创建对象的接口. 为何使用? 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。 我们以类Sample为例, 如果我们要创建Sample的实例对象: Sample sample=new Sample(); 可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等。 首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成: Sample sample=new Sample(参数); 但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码很难看了(就需要Refactor重整)。 为什么说代码很难看,初学者可能没有这种感觉,我们分析如下,初始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则

工厂模式 五种写法总结

一个人想着一个人 提交于 2019-12-15 00:42:04
文章目录 一概述: 使用场景: 二 简单(静态)工厂: 特点 缺点 三 另一种简单工厂(反射): 特点 缺点 四 多方法工厂(常用) 源码撑腰环节 五 普通工厂 普通工厂与简单工厂模式的区别: 缺点: 六 抽象工厂: 小结: 缺点 七 个人总结和使用场景 一概述: 属于创建型设计模式,需要生成的对象叫做产品 ,生成对象的地方叫做工厂 。 使用场景: 在任何需要生成复杂对象的地方,都可以使用工厂方法模式。 直接用new可以完成的不需要用工厂模式 个人理解,重点就是这个复杂 (构造函数有很多参数)和 是否可以 直接用new。(不理解这句话的话,看完一圈例子就理解了) 下面逐个介绍我所知道的各种工厂模式以及它们的特点,使用场景,并尽可能的找出JDK SDK里它们的身影。 二 简单(静态)工厂: 一个栗子: 我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类。 public abstract class INoodles { /** * 描述每种面条啥样的 */ public abstract void desc ( ) ; } 先来一份兰州拉面( 具体的产品类 ): public class LzNoodles extends INoodles { @Override public void desc ( ) { System . out . println ( "兰州拉面

设计模式之工厂模式

独自空忆成欢 提交于 2019-12-14 19:23:44
一、简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类 实现汽车接口 public interface Car { String getName ( ) ; } 奔驰类 public class Benz implements Car { @Override public String getName ( ) { return "Benz" ; } } 宝马类 public class BMW implements Car { @Override public String getName ( ) { return "BMW" ; } } 简单工厂,既能生产宝马又能生产奔驰 public class SimpleFactory { public Car getCar ( String name ) { if ( name . equals ( "BMW" ) ) { return new BMW ( ) ; } else if ( name . equals ( "benz" ) ) { return new Benz ( ) ; } else { System . out . println ( "不好意思,这个品牌的汽车生产不了" ) ; return null ; } } } 测试类