一、

制作一个抽象产品:螺丝

制作2个具体产品:8mm螺丝 和 6mm螺丝

使用简单工厂来实现这个场景,并且让客户端通过简单工厂来获取具体产品。

然后扩展一个7mm螺丝,你会发现这要修改简单工厂的代码。进而违反了开闭原则。

所以在使用工厂方法来重构一遍代码。保证7mm螺丝可以被顺利地扩展进来

简单工厂

/*** @author 郑金冲* @create 2020-05-29 20:29* @Description 简单工厂 作业* @Telephone 17805202282* @Email xiaozhengjc@163.com*/
public class Client {public static void main(String[] args) {Factory.getScrew("8毫米").screwInfourmation();}
}//产品基类: 螺丝
interface Screw {public void screwInfourmation();
}
//具体产品类: 8毫米螺丝
class EightMillimeterScrew implements Screw {@Overridepublic void screwInfourmation() {System.out.println("我是一个8毫米的螺丝啊。。。。");}
}
//具体产品类: 6毫米螺丝
class SixMillimeterScrew implements Screw {@Overridepublic void screwInfourmation() {System.out.println("我是一个6毫米的螺丝啊。。。。");}
}
//工厂
class Factory {public static Screw getScrew(String type) {Screw screw = null;switch (type) {case "8毫米":screw = new EightMillimeterScrew();break;case "6毫米":screw = new SixMillimeterScrew();break;}return screw;}
}

工厂方法

/*** @author 郑金冲* @create 2020-05-29 20:29* @Description 简单工厂 作业* @Telephone 17805202282* @Email xiaozhengjc@163.com*/
public class Client2 {public static void main(String[] args) {SevenMillimeterScrewFactory obj = new SevenMillimeterScrewFactory();obj.getScrew().screwInfourmation();}
}//产品基类: 螺丝
interface Screw {public void screwInfourmation();
}//具体产品类: 8毫米螺丝
class EightMillimeterScrew implements Screw {@Overridepublic void screwInfourmation() {System.out.println("我是一个8毫米的螺丝啊。。。。");}
}
//具体产品类: 7毫米螺丝
class SevenMillimeterScrew implements Screw {@Overridepublic void screwInfourmation() {System.out.println("我是一个7毫米的螺丝啊。。。。");}
}
//具体产品类: 6毫米螺丝
class SixMillimeterScrew implements Screw {@Overridepublic void screwInfourmation() {System.out.println("我是一个6毫米的螺丝啊。。。。");}
}
//螺丝工厂基类
interface ScrewFactory{public Screw getScrew();}
//8毫米螺丝工厂
class EightMillimeterScrewFactory implements ScrewFactory{@Overridepublic Screw getScrew() {return new EightMillimeterScrew();}
}
//7毫米螺丝工厂
class SevenMillimeterScrewFactory implements ScrewFactory{@Overridepublic Screw getScrew() {return new SevenMillimeterScrew();}
}
//6毫米螺丝工厂
class SixMillimeterScrewFactory implements ScrewFactory{@Overridepublic Screw getScrew() {return new SixMillimeterScrew();}
}

二、

总结工厂以及原型设计模式,谈谈你们开发过程中使用使用各种框架,
见识各种源码,在哪些地方体现了工厂模式,原型模式。
答:
    工厂模式:
        工厂模式实际应用中可分为简单工厂,工厂方法,抽象工厂三类
        简单工厂:
             优点:
                 * 1:将具体产品的类型 从客户端端代码中解耦出来
                 * 2:服务端代码修改了具体的产品类名 客户端不知道,这便符合我们的 面向接口编程 的思想
                 * 这里的接口不单包括 interface 只要是下层给上层暴露出来的方法、类 都可认为是面向接口编程里的接口形式
             缺点:
                 * 1:type 与具体产品映射关系
                 * 2:如果 具体产品非常大,简单工厂的代码会变得非常臃肿
                 * 3.扩展具体产品,势必会修改简单工厂的代码,违反了 开闭原则
                 * 4.始终丢失原始类数据
          工厂方法:
             优点:
                 * 1.具有简单工厂的优点 符合开闭原则
                 * 2.扩展了新产品,不需要修改作者原来的代码,新加一个工厂而已
             缺点:
                 * 1.高耦合了,只知道具体工厂类名 才能修改相关具体产品
                 * 2.每增加一个产品等级 就要增加一个生产产品的工厂以及具体的产品类 和产品生产工厂
                     这样会 造成类的爆炸式增长增加了系统复杂度 增加了开销
                 * 3.一个具体工厂只能创建一个具体产品
                 * 4.设计太过复杂
                 *
                 * 规约:约定大于配置
                 * 工厂的名字 视为接口。作为作者,有责任和义务保证工厂的名字是趋向稳定的
          抽象工厂:
              优点:具备简单工厂和工厂方法的优点
                 * 1.抽象工厂减少了工厂类,无论有多少的产品等级,工厂就一套
                 * 疑问: 为啥具体产品要这样搭配?
                 * 抽象工厂中,可以生产多个产品,这些产品必须要有逻辑关系
                 * 产品簇 ,产品等级
              缺点:
                 * 1.当产品等级发生变化,需要引起所有之前的工厂代码的修改违反了 开闭原则
            结论:
                 * 产品等级比较固定,考虑抽象工厂
                 * 产品等级经常变化 不建议抽象工厂
                 * 产品等级少 建议工厂方法
        spring bean的创建就是一个典型的工厂模式,我们无需创建Bean,Spring 的BeanFactory帮我们做到了,
        我们只要在需要的地方通过依赖注入来获取需要的实例。

原型模式:

1.类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗。
          2.通过new一个对象需要非常繁琐的数据准备或访问权限,可以使用原型模式。
          3.一个对象需要提供给其他对象访问,而且各个调用者可能需要修改其值,可以考虑使用原型模式拷贝多个对象供调用者使                  用,  即保护性拷贝

第二课 工厂模式和原型模式相关推荐

  1. 一口气讲完设计模式(单例模式、工厂模式、原型模式、建造者模式、适配器、桥梁模式)

    设计模式 使用设计模式,可以让我们的代码具有更好的可读性.可扩展性.可读性.重用性.符合高内聚低耦合的特点.作为程序员,是我们经常听到的概念,也是我们程序员必须深入学习,了解的知识. 设计模式种类 该 ...

  2. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  3. javascript 面向对象编程(工厂模式、构造函数模式、原型模式)

    javascript 面向对象编程(工厂模式.构造函数模式.原型模式) CreateTime--2018年3月29日17:09:38 Author:Marydon 一.工厂模式 /*** 工厂模式*/ ...

  4. 建造者模式与原型模式/builder模式与prototype模式/创建型模式

    建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...

  5. [19/04/24-星期三] GOF23_创建型模式(建造者模式、原型模式)

    一.建造者模式 本质:分离了对象子组件的单独构造(由Builder负责)和装配的分离(由Director负责),从而可以构建出复杂的对象,这个模式适用于:某个对象的构建过程十分复杂 好处:由于构建和装 ...

  6. Javascript 构造函数模式、原型模式

    前两天写完组合继承,打算总结一下原型继承的,不过今天看了一下工厂模式.构造函数模式和原型模式,觉得有必要总结一下以加深印象. ------------------------------------- ...

  7. 创建型模式:原型模式

    前方高能:<一故事一设计模式>PDF 电子书已经上线,关注公众号即可获取. 个人公众号原文: 创建型模式:原型模式 五大创建型模式之五:原型模式. 简介 姓名 :原型模式 英文名 :Pro ...

  8. 软件系统设计-4-建造者模式、原型模式

    1. 建造者模式 1.1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这些部 ...

  9. js面向对象-组合使用构造函数模式和原型模式(使用最广泛、认同度最高)

    组合使用构造函数模式和原型模式 构造函数模式用于定义实例属性 原型模式用于定义方法和共享的属性 优点:每个实例都有自己的实例属性的副本,但同时共享对方法的引用,最大限度的节省内存 function P ...

最新文章

  1. 实用ListView加载提示工具类
  2. Pycharm搜索文件名、符号名
  3. bug修复录-qq浏览器中post请求时body为空
  4. mysql 特殊函数_MySQL中sleep函数的特殊现象示例详解
  5. 宏在hybris impEx 产品主数据导入脚本中的用途
  6. 完整的python项目实例-Python实例练手项目汇总(附源码)
  7. python爬取汽车之家数据_Python神技能 | 使用爬虫获取汽车之家全车型数据
  8. scala下载新的版本号
  9. 控制工程实践(11)——控制系统辨识
  10. 华旭 身份证读卡器测试软件_华旭身份证读卡器阅读软件8.0版本 支持免驱
  11. html可以使用文本修饰标记定义,HTML标记功能详述-网站首页.ppt
  12. win7用友u8安装教程_win7系统安装用友u8的方法 win7用友u8安装教程
  13. 与师生谈人工智能3:精确定义之病
  14. 使用fir im进行内测托管
  15. 电大2019秋c语言程序设计,中央电大秋C语言程序设计A试题
  16. 文法与语言(笔记版)
  17. 泰坦尼克号任务-模型建立和评估
  18. 倒置字符串 将一句话的单词进行倒置,标点不倒置。
  19. Java学习笔记01—Java概述、数据类型、变量、标识符、类型转换
  20. 给hacke拨乱反正 黑客、红客、蓝客究竟是什么[摘]

热门文章

  1. mysql8.0 删除用户_MYSQL8 创建、删除用户和授权、消权操作
  2. Java输入字符串输出成语_java - 在Java中,你怎么把这种模式/成语? - SO中文参考 - www.soinside.com...
  3. IBM系统监控工具nmon命令详解(2)!
  4. POI执行EXCEL中的公式
  5. <四>objectARX开发:扩展数据XData、扩展记录XRecord和有名对象字典NameDict
  6. Android点击button弹出ProgressDialog,响应结束后ProgressDialog消失
  7. 静态路由及默认路由——基本配置
  8. HDU 6162 Ch’s gift
  9. 当AlphaGo战胜李世石以后,我们来聊聊深度学习
  10. Centos7 卸载rpm安装包