-实现了创建者和调用者的分离

-面向对象设计的基本原则:

  ·OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭

  ·DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程

  ·LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信

-核心本质:

  ·实例化对象,用工厂方法代替new操作

  ·将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦

-详细分类:

  ·简单工厂模式:也被称之为静态工厂,用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码,但实际开发比较常用)

  1. public interface Car {
  2. public void run();
  3. }
  4.  
  5. public class Audi implements Car{
  6. @Override
  7. public void run() {
  8. System.out.println("奥迪在跑!");
  9. }
  10. }
  11.  
  12. public class Byd implements Car{
  13. @Override
  14. public void run() {
  15. System.out.println("比亚迪在跑!");
  16. }
  17. }
  18.  
  19. /**
  20. * 简单工厂类,缺点:如果要添加新的车,不能扩展,只能修改原有的代码,违反了开闭原则
  21. * @author XuZeSen
  22. *
  23. */
  24. public class CarFactory {
  25. public static Car creatCar(String type){
  26. Car c = null;
  27. if("奥迪".equals(type)){
  28. c = new Audi();
  29. }
  30. if("比亚迪".equals(type)){
  31. c = new Byd();
  32. }
  33. return c;
  34. }
  35. }
  1. public class Client {
  2. public static void main(String[] args) {
  3. Car car1 = CarFactory.creatCar("奥迪");
  4. Car car2 = CarFactory.creatCar("比亚迪");
  5. car1.run();
  6. car2.run();
  7. }
  8. }

  ·工厂方法模式:用来生产同一等级结构中的固定产品。(支持增加任意产品,遵循了开闭原则,每次有新的车加入,只需添加一个新的工厂类即可,无需修改原有的代码,缺点:产品一多,类也不断增多了,不好管理)

  1. public interface Car {
  2. public void run();
  3. }
  4.  
  5. public class Audi implements Car{
  6. @Override
  7. public void run() {
  8. System.out.println("奥迪在跑!");
  9. }
  10. }
  11.  
  12. public class Byd implements Car{
  13. @Override
  14. public void run() {
  15. System.out.println("比亚迪在跑!");
  16. }
  17. }

/**
* 工厂方法的共同接口,每次有新的产品,只需添加一个新的实现类即可,无需修改原有代码
* @author XuZeSen
*
*/

  1. public interface CarFactory {
  2. Car creatCar();
  3. }
  4.  
  5. public class AudiFactory implements CarFactory{
  6. @Override
  7. public Car creatCar() {
  8. return new Audi();
  9. }
  10. }
  11.  
  12. public class BydFactory implements CarFactory{
  13. @Override
  14. public Car creatCar() {
  15. return new Byd();
  16. }
  17. }
  18.  
  19. public class Client {
  20. public static void main(String[] args) {
  21. CarFactory carFactory1 = new AudiFactory();
  22. Car car1 = carFactory1.creatCar();
  23.  
  24. CarFactory carFactory2 = new BydFactory();
  25. Car car2 = carFactory2.creatCar();
  26.  
  27. car1.run();
  28. car2.run();
  29. }
  30. }

  ·抽象工厂模式:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

GOF23设计模式之工厂模式的更多相关文章

  1. 【GOF23设计模式】工厂模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_简单工厂模式详解.面向对象设计原则.开闭原则.依赖反转原则.迪米特法则  没有工厂模式的情况 package com.te ...

  2. 【GOF23设计模式】--工厂模式

    工厂模式: 实现了创建者调用者的分离 详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当 ...

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

    一.工厂模式概述 实现了创建者和调用者的分离 (1)分类 ①简单工厂模式 虽然某种程度不符合设计原则,但实际使用最多. ②工厂方法模式 不修改已有类的前提下,通过增加新的工厂类实现扩展. ③抽象工厂模 ...

  4. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  5. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  6. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  7. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  8. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  9. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

随机推荐

  1. autocomplete的使用

    autocomplete使用分为本地调用方法和读取远程读取数据源的方法 (1)本地调用方法 <script src="Scripts/jquery-1.4.1.min.js" ...

  2. maven依赖查询地址

    http://search.maven.org/#search%7Cga%7C1%7C

  3. Android Socket连接PC出错问题及解决

    最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.

  4. Linux下编译安装Vim8.0

    什么是Vim? Vim 是经典的 UNIX 编辑器 Vi 的深度改良版本.它增加了许多功能,包括:多级撤销.格式高亮.命令行历史.在线帮助.拼写检查.文件名补完.块操作.脚本支持,等等.除了字符界面版 ...

  5. 通过Mono 在 Heroku 上运行 .NET 应用

    英文原文:Running .NET on Heroku 中文原文:在 Heroku 上运行 .NET 应用 自从加入了Heroku之后,我就想在这个平台上运行.NET程序.现在我很高兴向大家宣布,我们 ...

  6. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  7. 【完全开源】知乎日报UWP版:增加Live磁贴、Badge、以及Toast通知

    目录 说明 实现方法 APP生命期 后台任务 说明 之前网上有人建议增加磁贴(tile).徽章(badge)功能.利用周末的时间,将这两个功能添加上去了.如果将磁贴固定到开始屏幕,磁贴就会循环播放首页 ...

  8. Go语言实战 - 我需要站内搜索

    山坡网的用户抱怨"为什么搜索'二鬼子李富贵'找不到'二鬼子汉奸李富贵'?我用百度搜都能找到." 当时我就滴汗了,用户说的有道理,应该要能搜索到. 之前的方案很简单,用户输入的字串会 ...

  9. 完善Person页面的视图操作功能

    经过上一篇,我们的person的权限已经正常加上了.那么我们回到我们的菜单类.给他重新加上权限. 这样的话,我们在启动页面的时候就不会看见联系人管理菜单了.只有登录后才可以看到菜单信息了. 添加控制器 ...

  10. WEB 基础知识(一)

    1. 系统架构 1.1 B/S系统架构 1.2 C/S系统架构 1.3 对比与区别 1.3.1 概述 C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过 ...