模式学习之创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 - Nicotine_SZZ

s1127736971 2021-08-07 原文

简单工厂模式

 

  1. public interface water { //先定义“概念”产品 这里是water
  2. public void say();
  3. }
  4. public class SickWater implements water{//产品的具体实现
  5. @Override
  6. public void say() {
  7. System.out.println("i am sick water!");
  8. }
  9. }
  10. public class CleanWater implements water {
  11. @Override
  12. public void say() {
  13. System.out.println("i am clean water!");
  14. }
  15. }
  16. public class WaterFactory {//制造产品的工厂
  17. public water waterProduce (String waterName){//根据输入的产品参数制造相应产品 方法前面用 water 这个“概念” 产品。
  18. switch (waterName){
  19. case "clean":
  20. return new CleanWater();
  21. case "sick":
  22. return new SickWater();
  23. default:
  24. System.out.println("请输出正确数值");
  25. return null;
  26. }
  27. }
  28. }
  29. public class Test {
  30. public static void main(String[] args) {
  31. // TODO Auto-generated method stub
  32. WaterFactory wf = new WaterFactory ();
  33. water clean = wf.waterProduce("clean");
  34. water sick = wf.waterProduce("sick");
  35. clean.say();
  36. sick.say();
  37. }
  38. }
  39. /*
  40. 输出:
  41. i am clean water!
  42. i am sick water!
  43. */

 

多个工厂模式

  1. public class WaterFactory {//简单的修改 将上面的需要输出参数制造产品的特点变成,手动选择产品,防止输入错误参数。个人感觉挺不错的。
  2. public water produceSickWater (){
  3. return new SickWater ();
  4. }
  5. public water produceCleanWater (){
  6. return new CleanWater ();
  7. }
  8. }
  9. public class Test {
  10. public static void main(String[] args) {
  11. // TODO Auto-generated method stub
  12. WaterFactory wf = new WaterFactory ();
  13. water clean = wf.produceCleanWater();//使用方法的稍微区分,输出一样。
  14. water sick = wf.produceSickWater();
  15. clean.say();
  16. sick.say();
  17. }
  18. }

 

 

静态工厂模式

  1. public class WaterFactory {
  2. public static water produceSickWater (){//也仅仅只是在制造产品前面静态化了,这样使用不需要实例化。
  3. return new SickWater ();
  4. }
  5. public static water produceCleanWater (){
  6. return new CleanWater ();
  7. }
  8. }
  9. public class Test {
  10. public static void main(String[] args) {
  11. // TODO Auto-generated method stub
  12. water clean =WaterFactory.produceCleanWater();//直接用工厂静态方法,很方便。 所以大多是第三种模式。
  13. water sick = WaterFactory.produceSickWater();
  14. clean.say();
  15. sick.say();
  16. }
  17. }

 

接着是抽象工厂类

  1. public interface water { //先定义“概念”产品 这里是water
  2. public void say();
  3. }
  4. public class SickWater implements water{//产品的具体实现
  5. @Override
  6. public void say() {
  7. System.out.println("i am sick water!");
  8. }
  9. }
  10. public class CleanWater implements water {
  11. @Override
  12. public void say() {
  13. System.out.println("i am clean water!");
  14. }
  15. }
  16. public interface AbstractFatory {//很重要!抽象工厂模式,个人认为抽象的体现就在这里,这里定义一个工厂该干的活,至于是什么工厂,后面具体实现。
  17. //这样就实现了增加新的产品,就是增加新的工厂,而不是对之前那个工厂类进行添加,做到闭包原则,虽然看起来很麻烦的样子。
  18. public water produce ();
  19. }
  20. public class SickWaterFactory implements AbstractFatory{//工厂的具体实现,只能增加不能修改
  21. @Override
  22. public water produce() {
  23. // TODO Auto-generated method stub
  24. return new SickWater();
  25. }
  26. }
  27. public class CleanWaterFactory implements AbstractFatory{
  28. @Override
  29. public water produce() {
  30. // TODO Auto-generated method stub
  31. return new CleanWater();
  32. }
  33. }
  34. public class Test {
  35. public static void main(String[] args) {
  36. // TODO Auto-generated method stub
  37. CleanWaterFactory cleanFactory = new CleanWaterFactory();
  38. SickWaterFactory sickFactory = new SickWaterFactory();
  39. water clean =cleanFactory.produce();
  40. water sick = sickFactory.produce();//很明显不方便的一点就是我需要多少产品就得知道多少工厂。
  41. clean.say();
  42. sick.say();
  43. }
  44. }

工厂模式和简单工厂模式,个人写的例子不是很好,给产品更多的参数,不是一个简单的say,实际运作也是以产品的各种参数值来定

具体可以看看        http://blog.csdn.net/jason0539/article/details/44976775     和      http://www.cnblogs.com/itTeacher/archive/2012/11/30/2796122.html

工厂模式的关键在于  抽象产品  具体产品  工厂 的实现  抽象工厂模式是 抽象产品  具体产品  抽象工厂 具体工厂 的实现

 

单例模式:当一个占用内存较大的类被频繁创建NEW,将占用极大内存。或者像中心系统一样,只允许存在一个,都需要单例模式。

 

  1. public class Hungry {
  2. private Hungry(){//私有化构造函数 不让new。
  3. }
  4. private static Hungry instance = new Hungry();//静态化实例
  5. public Hungry getInstance(){
  6. return instance;//获得单例实例化
  7. }
  8. //这个是饿汉模式 优点是简单 ,线程安全,缺点是一开始就创建,浪费内存。
  9. }
  10. public class Perfact {//较为理想的单例模式
  11. private Perfact() {
  12. }
  13. private static Perfact instance;//先不着急构造,利用 getINstance 进行构造,反正开始创建浪费内存。
  14.  
  15. public static Perfact getInstance() {
  16. if (instance == null) {//不使用同步代码块 不是空的就直接返回一个instance
  17. synchronized (Perfact.class) {//保证线程安全
  18. if (instance == null) {
  19. instance = new Perfact();
  20. }
  21. }
  22. }
  23. return instance;
  24. }
  25. }

 

 

 

建造者模式

1.概念

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示]

    与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。

  建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。

  举个简单的例子,如汽车,有很多部件,车轮,方向盘,发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一部汽车,这个装配过程也很复杂(需要很好的组装技术), builder模式就是为了将部件和组装分开。

2.UML图

  1. public class Person {//个人是先从product 开始入手,头手脚是部件。
  2. private String foot;
  3. private String head;
  4. private String hand;
  5. public String getFoot() {
  6. return foot;
  7. }
  8. public void setFoot(String foot) {
  9. this.foot = foot;
  10. }
  11. public String getHead() {
  12. return head;
  13. }
  14. public void setHead(String head) {
  15. this.head = head;
  16. }
  17. public String getHand() {
  18. return hand;
  19. }
  20. public void setHand(String hand) {
  21. this.hand = hand;
  22. }
  23. }
  24. public interface PersonBuilder {// Builder 定义抽象接口一个Builder该做什么
  25. void buildHead();
  26. void buildHand();
  27. void buildFoot();
  28. Person buildPerson();
  29. }
  30. public class ManBuilder implements PersonBuilder {//该做什么的具体实现
  31. private Person person;
  32. public ManBuilder(){
  33. this.person= new Person();
  34. }
  35. @Override
  36. public void buildHead() {
  37. // TODO Auto-generated method stub
  38. person.setHead("man head.");
  39. }
  40. @Override
  41. public void buildHand() {
  42. // TODO Auto-generated method stub
  43. person.setHand("man hand");
  44. }
  45. @Override
  46. public void buildFoot() {
  47. // TODO Auto-generated method stub
  48. person.setFoot("man foot");
  49. }
  50. @Override
  51. public Person buildPerson() {
  52. // TODO Auto-generated method stub
  53. return person;
  54. }
  55. }
  56. public class WomenBuilder implements PersonBuilder {//具体实现women
  57. private Person person;
  58. public WomenBuilder(){
  59. this.person= new Person();
  60. }
  61. @Override
  62. public void buildHead() {
  63. // TODO Auto-generated method stub
  64. person.setHead("man head.");
  65. }
  66. @Override
  67. public void buildHand() {
  68. // TODO Auto-generated method stub
  69. person.setHand("man hand");
  70. }
  71. @Override
  72. public void buildFoot() {
  73. // TODO Auto-generated method stub
  74. person.setFoot("man foot");
  75. }
  76. @Override
  77. public Person buildPerson() {
  78. // TODO Auto-generated method stub
  79. return person;
  80. }
  81. }
  82. public class PersonDirect {//建造者模式中的“建造者”
  83. public Person construct (PersonBuilder pb){
  84. pb.buildHead();
  85. pb.buildHand();
  86. pb.buildFoot();
  87. return pb.buildPerson();
  88. }
  89. }
  90. public class Test2 {//测试类
  91.  
  92. public static void main(String[] args) throws CloneNotSupportedException {
  93. // TODO Auto-generated method stub
  94. PersonDirect pc = new PersonDirect();
  95. Person man = pc.construct(new ManBuilder());
  96. }
  97. }

建造者模式将很多功能集成到一个类里,这个类可以创造出比较复杂的东西。所以与工厂模式的区别就是:工厂模式关注的是创建单个产品,而建造者模式则关注创建符合对象的多个部分。因此,是选择工厂模式还是建造者模式,依实际情况而定。摘录自   http://blog.csdn.net/zhangerqing/article/details/8194653       http://www.cnblogs.com/devinzhang/archive/2012/01/06/2314670.html        http://blog.csdn.net/jason0539/article/details/44992733

 

 

原型模式,即深拷贝,在这里介绍另一种深拷贝的方法 是继承自Serializable 接口

  1. public class Teacher implements Serializable{//作为student的内对象,必须implements Serializable 不然student在序列化的时候会抛出错误。
  2. /**
  3. *
  4. */
  5. private String name;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. }
  13. public class Student implements Serializable{
  14. /**
  15. *
  16. */
  17. private static final long serialVersionUID = 1L;
  18. private Teacher teacher;
  19. private String name;
  20. public Teacher getTeacher() {
  21. return teacher;
  22. }
  23. public void setTeacher(Teacher teacher) {
  24. this.teacher = teacher;
  25. }
  26. public String getName() {
  27. return name;
  28. }
  29. public void setName(String name) {
  30. this.name = name;
  31. }
  32. public Object deepClone() throws Exception
  33. {
  34. // 序列化
  35. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  36. ObjectOutputStream oos = new ObjectOutputStream(bos);
  37. oos.writeObject(this);
  38. // 反序列化
  39. ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
  40. ObjectInputStream ois = new ObjectInputStream(bis);
  41. return ois.readObject();
  42. }
  43. }
  44. public class Test2 {
  45. public static void main(String[] args) throws Exception {
  46. // TODO Auto-generated method stub
  47. Teacher t = new Teacher();
  48. Student s = new Student ();
  49. s.setTeacher(t);//要设置,不然teacher都为null 下面会判断成true
  50. Student s2 = (Student) s.deepClone();
  51. System.out.print(s==s2);
  52. System.out.print(s.getTeacher()==s2.getTeacher());
  53. }
  54. }//输出两个false 深拷贝成功

 

发表于
2017-08-30 11:15 
Nicotine_SZZ 
阅读(332
评论(0
编辑 
收藏 
举报

 

版权声明:本文为s1127736971原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/s1127736971/articles/7452144.html

模式学习之创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 - Nicotine_SZZ的更多相关文章

  1. js 实现排序算法 — 希尔排序(Shell Sort)

    原文:   十大经典排序算法(动图演示)   希尔排序   1959年Shell发明,第一个突破O(n2)的排 […]...

  2. chromedp入门 – 轩脉刃

    chromedp入门 2020-06-23 14:43  轩脉刃  阅读(5167)  评论(0)  编辑  […]...

  3. spring cloud 熔断器 – it王珂

    spring cloud 熔断器 熔断器 也叫断路器 什么是断路器 它就相当于项目中的保险丝  当你的微服务拆 […]...

  4. ComponentArt WebUI3.0控件使用方法 – 笑望人生

    ComponentArt WebUI3.0控件使用方法 ComponentArt推出的 WebUI控件大家都非 […]...

  5. Apache POI 操作Excel(3)– Excel基础 – 快乐随行

    Apache POI 操作Excel(3)– Excel基础 Excel基本组成 首先在生成Exc […]...

  6. A*算法 计算2D格子地图的最优移动路径 – 萧然CS

    A*算法 计算2D格子地图的最优移动路径 主要参考:unity3D 简单实现A*算法 using System […]...

  7. 微信小程序之猜拳游戏 – 浅草yan

    微信小程序之猜拳游戏 —恢复内容开始—   最近几天在学习小程序,看了网上的学习视频, […]...

  8. [源码解析] 机器学习参数服务器ps-lite 之(3) —– 代理人Customer

    本文是参数服务器第三篇,介绍ps-lite的Customer模块。 [源码解析] 机器学习参数服务器ps-li […]...

随机推荐

  1. 理解RESTful API

    RESTful API到底是个什么东西 近日妹子向我求助RESTful API到底是个什么东西。原因是她们公司 […]...

  2. 树莓派3B+简单入门

    树莓派简单入门,安装系统、3.5寸LCD电阻屏、使用VNC远程桌面。     刚刚入手一个树莓派3B+,树莓派 […]...

  3. 【TCP/IP网络编程】:09套接字的多种可选项

    本篇文章主要介绍了套接字的几个常用配置选项,包括SO_SNDBUF & SO_RCVBUF、SO_RE […]...

  4. JAVA中的流-简介(二)

    标准流 类名:System.in 读取用户输入界面的类容,在以前的使用中与scanner一起使用 使用: In […]...

  5. 关于STM32中GPIO的8种工作模式

    CSDN:http://blog.csdn.net/l20130316 博客园:http://www.cnbl […]...

  6. 使用DigitalOcean 自由的上网

    如何获取免费的云服务器 使用这个地址 https://m.do.co/c/c4512493311c 注册Dig […]...

  7. 《手把手教你》系列进阶篇之1-python+ selenium自动化测试 – python基础扫盲(详细教程)

    1. 简介   如果你从一开始就跟着宏哥看博客文章到这里,基础篇和练习篇的文章。如果你认真看过,并且手动去敲过 […]...

  8. 【python】地图热力图随机经纬度格式生成器

    python地图热力图随机经纬度格式生成器,配合地图热力图程序“食用”更佳哦~ import re impor […]...