(用到了依赖倒置原则)

我们写的代码中,有的时候可能会出现根据外面给定的不同的参数在方法中根据参数实例化不同的实例,就是会根据不同的参数会new出不同的实例。如果这么写了,这段代码会非常的脆弱,一旦出现新的类型,那么就需要重写将这段代码找出来添加写的new。
之前说过针对接口编程,而不是针对实现。这句话也可以理解成,代码中尽量不要出现具体的实例。能用到实例的地方,应该用超类来代替,通过多态让代码走正确的分支。

通过例子来说明(看的就是《Head First 设计模式》这本书,所有还是用书中的例子)
不用工厂模式,我们就是这么写

Pizza orderPizza(String type){Pizaa pizza;if (type.equals("cheese")) {pizza = new CheesePizza();} else if (type.equals("clam")) {pizza = new ClamPizza();}pizza.prepare();pizza.bake();//.........
}

通过工厂模式

  Pizza orderPizza(String type) {Pizza pizza = factory.createPizze("cheese");pizza.prepare();pizza.bake();// .........return pizza;}class SimplePizzaFactory {public Pizza createPizze(String type) {Pizza pizza = null;if (type.equals("cheese")) {pizza = new CheesePizza();} else if (type.equals("clam")) {pizza = new ClamPizza();}return pizza;}
}

这么一看,我们似乎什么也没干,只是将代码搬到了另外一个地方。但是注意到,修改后的方法中,没有new,以后如果有新的类型的Pizza只需要修改这段代码就可以了,orderPizza的方法不用动。工厂模式就这么简单。还有另外一种类型的工厂模式,用静态方法返回实例对象,这种叫静态工厂。

class SimplePizzaFactory {public static Pizza createCheesePizze() {return new CheesePizza();}public static Pizza createClamPizze() {return new ClamPizza();}
}

这就是工厂模式。其实工厂模式像是一种编程习惯。然后说一下抽象工厂模式。

抽象工厂模式的作用是建立一个产品家族的抽象类型,这个类型的子类定义了实例化实例的方法,想要获取实例,首先要实例这个类型的实例,在将这个实例传入某个工厂中。抽象工厂一般配合着工厂模式使用。抽象工厂的具体工厂通常用工厂方法创建。工厂模式的主要作用是创建类的实例,抽象工厂的作用是创建一系列的实例。

根据上面修改看一下抽象工厂的代码

interface Pizza {public void prepare();public void bake();
}class NSCheesePizza implements Pizza {@Overridepublic void prepare() {}@Overridepublic void bake() {}
}class NSClamPizza implements Pizza {@Overridepublic void prepare() {}@Overridepublic void bake() {}
}class ChicagoCheesePizza implements Pizza {@Overridepublic void prepare() {}@Overridepublic void bake() {}
}class ChicagoClamPizza implements Pizza {@Overridepublic void prepare() {}@Overridepublic void bake() {}
}abstract class PizzaStore {public Pizza orderPizza(String type) {Pizza pizza = null;pizza = createPizza(type);pizza.prepare();pizza.bake();return pizza;}abstract Pizza createPizza(String type);
}class NYPizzaStore extends PizzaStore {@OverridePizza createPizza(String type) {if (type.equals("chesse")) {return new NSCheesePizza();}return null;}
}class ChicagoPizzaStore extends PizzaStore {@OverridePizza createPizza(String type) {if (type.equals("chesse")) {return new ChicagoCheesePizza();}return null;}
}
public class Test {public static void main(String[] args) {PizzaStore nyStore = new NYPizzaStore();Pizza pizza = nyStore.orderPizza("cheese");}
}

这里用到了依赖倒置原则。怎么倒置的,开始时需要制作不同的pizza,不同的具体类,这样所有的pizza店都会依赖这些具体类。于是,抽象出来了一个Pizza,这样就需要一个pizza工厂,然后所有的pizza类都依赖这样一个抽象,并且pizza店也需要这个抽象。这样我们就倒置了商店依赖具体pizza类的设计。

怎么才能避免违反依赖倒置原则:
1、变量不可以持有具体类的引用。(避免使用new)
2、不要让类派生具体类。
3、不要覆盖基类已经实现的方法。(如果覆盖了基类的方法,就说明这个类不是一个真正适合的抽象类)

转载于:https://www.cnblogs.com/badboyf/p/6212464.html

Head First 设计模式 --4 工厂模式 抽象工厂模式相关推荐

  1. (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现

    简介 设计模式是为了解决一些出现的问题设计的解决方案.是长时间经验的总结,是根据不同问题从而提出并且实践出来的解决办法.使用不同的设计模式可以解决不同的问题. 设计模式可以分为三种大类别:分别是创建型 ...

  2. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂——理解“开放封闭”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂--理解"开放封闭" 一个不简单的简单工厂引发的命案 在实际的业务中,我们往往面对的复杂度并非数个类 ...

  3. Head First设计模式读书笔记四 简单工厂 工厂模式 抽象工厂模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: 工厂模式 https://blog.csdn.net/u011109881/article/details/56541580 ...

  4. 设计模式---(3)抽象工厂模式

    抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...

  5. Java设计模式—工厂方法模式抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

  6. 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...

  7. 【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝

    目录 说明 实现方式 自问自答 其他链接 说明 五大创建型模式之一,其他还有单例模式.原型模式.建造者模式.工厂模式. 抽象工厂模式(Abstract Factory Pattern):定义了一个in ...

  8. 设计模式(二)抽象工厂模式

    抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...

  9. 研磨23种大话设计模式------简单工厂模式 + 工厂方法模式 + 抽象工厂模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 简 ...

  10. 设计模式-创建型模式-抽象工厂模式

    工程源码:设计模式-创建型模式-抽象工厂模式https://download.csdn.net/download/qq_40788199/85544119 码云:设计模式-创建型模式-抽象工厂模式ht ...

最新文章

  1. 在Windows下使用MinGW静态编译Assimp
  2. Python Study:GUI-Tkinter
  3. linux生成数字命令,Linux下随机生成密码的命令
  4. java.lang包—StringBuffer类和StringBuilder类
  5. html静态网页模板cs4,Adobe Dreamweaver CS4 精简版
  6. (字符串)字符串中首先出现两次的字符
  7. zrender zlevel层叠控制和Group使用笔记
  8. POJ 2115C Looooops[一元线性同余方程]
  9. 基于Java的项目开发过程
  10. JAVA以及常用开源框架读音发音和介绍
  11. J2EE是什么(二)
  12. docker-compose文件内容见下文,报错信息:redis    | Error execut
  13. linux debian 设置 开机 启动
  14. 家政服务app软件开发
  15. Caused by: java.sql.SQLException: connection holder is null
  16. vue获取上级路由地址
  17. KendoUI组件基础(上)
  18. English总结(一)-- 常用语句篇
  19. 如何搭建“业务化”的指标体系?
  20. 强制删除鲁大师所有文件

热门文章

  1. MyEclipse中防止代码格式化时出现换行
  2. MPLS(多协议标记交换)协议能否降低跨省组建企业专网的成本?
  3. 图解java_图解 Java 中的数据结构及原理!
  4. 地图整饰-框架与格网
  5. 符号级别(二)--实际应用
  6. Java通过Netty实现Websocket消息推送
  7. .net core 多平台开发体验
  8. C#中的底层音频控制播放
  9. qt_3_Qt开发环境
  10. Docker 基本操作