当前位置: 首页 > news >正文

湖南省建设工程网站深圳网站建设fantodo

湖南省建设工程网站,深圳网站建设fantodo,南昌市经济技术开发区属于哪个区,wordpress 权限是一个类还是一个函数创建型设计模式 单例 工厂模式 看这一篇就够了_软工菜鸡的博客-CSDN博客 4.3 原型模式 4.3.1 概述 用一个已经创建的实例作为原型#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 4.3.2 结构 原型模式包含如下角色#xff1a; 抽象原型类#xff1a;规定了…创建型设计模式 单例 工厂模式 看这一篇就够了_软工菜鸡的博客-CSDN博客 4.3 原型模式 4.3.1 概述 用一个已经创建的实例作为原型通过复制该原型对象来创建一个和原型对象相同的新对象。 4.3.2 结构 原型模式包含如下角色 抽象原型类规定了具体原型对象必须实现的的 clone() 方法。具体原型类实现抽象原型类的 clone() 方法它是可被复制的对象。访问类使用具体原型类中的 clone() 方法来复制新的对象。 接口类图如下 4.3.3 实现 原型模式的克隆分为浅克隆和深克隆。 浅克隆创建一个新对象 新对象的属性和原来对象完全相同对于非基本类型属性 仍指向原有属性 所指向的对象 的 内存 地址。 深克隆创建一个新对象 属性中引用的其他对象也会被克隆不再指向原有对象地址。 Java中的Object类中提供了 clone() 方法来实现浅克隆。 Cloneable 接口是上面的类图中的抽象原型类而实现了Cloneable接口的子实现类就是具体的原型类。代码如下 Realizetype具体的原型类 public class Realizetype implements Cloneable {public Realizetype() {System.out.println(具体的原型对象创建完成);}Overrideprotected Realizetype clone() throws CloneNotSupportedException {System.out.println(具体原型复制成功);return (Realizetype) super.clone();} } PrototypeTest测试访问类 public class PrototypeTest {public static void main(String[] args) throws CloneNotSupportedException {Realizetype r1 new Realizetype();Realizetype r2 r1.clone();System.out.println(对象r1和r2是同一个对象 (r1 r2));} } 4.3.4 案例 用原型模式生成“三好学生”奖状 同一学校的“三好学生”奖状除了获奖人姓名不同其他都相同可以使用原型模式复制多个“三好学生”奖状出来然后在修改奖状上的名字即可。 类图如下 代码如下 //奖状类 public class Citation implements Cloneable {private String name;public void setName(String name) {this.name name;}public String getName() {return (this.name);}public void show() {System.out.println(name 同学在2020学年第一学期中表现优秀被评为三好学生。特发此状);}Overridepublic Citation clone() throws CloneNotSupportedException {return (Citation) super.clone();} }//测试访问类 public class CitationTest {public static void main(String[] args) throws CloneNotSupportedException {Citation c1 new Citation();c1.setName(张三);//复制奖状Citation c2 c1.clone();//将奖状的名字修改李四c2.setName(李四);c1.show();c2.show();} } 4.3.5 使用场景 对象的创建非常复杂可以使用原型模式快捷的创建对象。性能和安全要求比较高。 4.3.6 扩展深克隆 将上面的“三好学生”奖状的案例中Citation类的name属性修改为Student类型的属性。代码如下 //奖状类 public class Citation implements Cloneable {private Student stu;public Student getStu() {return stu;}public void setStu(Student stu) {this.stu stu;}void show() {System.out.println(stu.getName() 同学在2020学年第一学期中表现优秀被评为三好学生。特发此状);}Overridepublic Citation clone() throws CloneNotSupportedException {return (Citation) super.clone();} }//学生类 public class Student {private String name;private String address;public Student(String name, String address) {this.name name;this.address address;}public Student() {}public String getName() {return name;}public void setName(String name) {this.name name;}public String getAddress() {return address;}public void setAddress(String address) {this.address address;} }//测试类 public class CitationTest {public static void main(String[] args) throws CloneNotSupportedException {Citation c1 new Citation();Student stu new Student(张三, 西安);c1.setStu(stu);//复制奖状Citation c2 c1.clone();//获取c2奖状所属学生对象Student stu1 c2.getStu();stu1.setName(李四);//判断stu对象和stu1对象是否是同一个对象System.out.println(stu和stu1是同一个对象 (stu stu1));c1.show();c2.show();} } 运行结果为 说明 stu对象和stu1对象是同一个对象就会产生将stu1对象中name属性值改为“李四”两个Citation奖状对象中显示的都是李四。这就是浅克隆的效果对具体原型类Citation中的引用类型的属性进行引用的复制。这种情况需要使用深克隆而进行深克隆需要使用对象流。代码如下 public class CitationTest1 {public static void main(String[] args) throws Exception {Citation c1 new Citation();Student stu new Student(张三, 西安);c1.setStu(stu);//创建对象输出流对象ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(C:\\Users\\Think\\Desktop\\b.txt));//将c1对象写出到文件中oos.writeObject(c1);oos.close();//创建对象出入流对象ObjectInputStream ois new ObjectInputStream(new FileInputStream(C:\\Users\\Think\\Desktop\\b.txt));//读取对象Citation c2 (Citation) ois.readObject();//获取c2奖状所属学生对象Student stu1 c2.getStu();stu1.setName(李四);//判断stu对象和stu1对象是否是同一个对象System.out.println(stu和stu1是同一个对象 (stu stu1));c1.show();c2.show();} } 运行结果为 注意Citation类和Student类必须实现Serializable接口否则会抛NotSerializableException异常。 4.4 建造者模式无 4.4.1 概述 将一个复杂对象的构建与表示分离使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦。不同的构建器相同的装配也可以做出不同的对象相同的构建器不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦实现了更好的复用。建造者模式可以将部件和其组装过程分开一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象而无须知道其内部的具体构造细节。 4.4.2 结构 建造者Builder模式包含如下角色 抽象建造者类Builder这个接口规定要实现复杂对象的那些部分的创建并不涉及具体的部件对象的创建。具体建造者类ConcreteBuilder实现 Builder 接口完成复杂产品的各个部件的具体创建方法。在构造过程完成后提供产品的实例。产品类Product要创建的复杂对象。指挥者类Director调用具体建造者来创建复杂对象的各个部分在指导者中不涉及具体产品的信息只负责保证对象各部分完整创建或按某种顺序创建。 类图如下 4.4.3 实例 创建共享单车 生产自行车是一个复杂的过程它包含了车架车座等组件的生产。而车架又有碳纤维铝合金等材质的车座有橡胶真皮等材质。对于自行车的生产就可以使用建造者模式。 这里Bike是产品包含车架车座等组件Builder是抽象建造者MobikeBuilder和OfoBuilder是具体的建造者Director是指挥者。类图如下 具体的代码如下 //自行车类 public class Bike {private String frame;private String seat;public String getFrame() {return frame;}public void setFrame(String frame) {this.frame frame;}public String getSeat() {return seat;}public void setSeat(String seat) {this.seat seat;} }// 抽象 builder 类 public abstract class Builder {protected Bike mBike new Bike();public abstract void buildFrame();public abstract void buildSeat();public abstract Bike createBike(); }//摩拜单车Builder类 public class MobikeBuilder extends Builder {Overridepublic void buildFrame() {mBike.setFrame(铝合金车架);}Overridepublic void buildSeat() {mBike.setSeat(真皮车座);}Overridepublic Bike createBike() {return mBike;} }//ofo单车Builder类 public class OfoBuilder extends Builder {Overridepublic void buildFrame() {mBike.setFrame(碳纤维车架);}Overridepublic void buildSeat() {mBike.setSeat(橡胶车座);}Overridepublic Bike createBike() {return mBike;} }//指挥者类 public class Director {private Builder mBuilder;public Director(Builder builder) {mBuilder builder;}public Bike construct() {mBuilder.buildFrame();mBuilder.buildSeat();return mBuilder.createBike();} }//测试类 public class Client {public static void main(String[] args) {showBike(new OfoBuilder());showBike(new MobikeBuilder());}private static void showBike(Builder builder) {Director director new Director(builder);Bike bike director.construct();System.out.println(bike.getFrame());System.out.println(bike.getSeat());} } 注意 上面示例是 Builder模式的常规用法指挥者类 Director 在建造者模式中具有很重要的作用它用于指导具体构建者如何构建产品控制调用先后次序并向调用者返回完整的产品类但是有些情况下需要简化系统结构可以把指挥者类和抽象建造者进行结合 // 抽象 builder 类 public abstract class Builder {protected Bike mBike new Bike();public abstract void buildFrame();public abstract void buildSeat();public abstract Bike createBike();public Bike construct() {this.buildFrame();this.BuildSeat();return this.createBike();} } 说明 这样做确实简化了系统结构但同时也加重了抽象建造者类的职责也不是太符合单一职责原则如果construct() 过于复杂建议还是封装到 Director 中。 4.4.4 优缺点 优点 建造者模式的封装性很好。使用建造者模式可以有效的封装变化在使用建造者模式的场景中一般产品类和建造者类是比较稳定的因此将主要的业务逻辑封装在指挥者类中对整体而言可以取得比较好的稳定性。在建造者模式中客户端不必知道产品内部组成的细节将产品本身与产品的创建过程解耦使得相同的创建过程可以创建不同的产品对象。可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中使得创建过程更加清晰也更方便使用程序来控制创建过程。建造者模式很容易进行扩展。如果有新的需求通过实现一个新的建造者类就可以完成基本上不用修改之前已经测试通过的代码因此也就不会对原有功能引入风险。符合开闭原则。 缺点 造者模式所创建的产品一般具有较多的共同点其组成部分相似如果产品之间的差异性很大则不适合使用建造者模式因此其使用范围受到一定的限制。 4.4.5 使用场景 建造者Builder模式创建的是复杂对象其产品的各个部分经常面临着剧烈的变化但将它们组合在一起的算法却相对稳定所以它通常在以下场合使用。 创建的对象较复杂由多个部件构成各部件面临着复杂的变化但构件间的建造顺序是稳定的。创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式即产品的构建过程和最终的表示是独立的。 4.4.6 模式扩展 建造者模式除了上面的用途外在开发中还有一个常用的使用方式就是当一个类构造器需要传入很多参数时如果创建这个类的实例代码可读性会非常差而且很容易引入错误此时就可以利用建造者模式进行重构。 重构前代码如下 public class Phone {private String cpu;private String screen;private String memory;private String mainboard;public Phone(String cpu, String screen, String memory, String mainboard) {this.cpu cpu;this.screen screen;this.memory memory;this.mainboard mainboard;}public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu cpu;}public String getScreen() {return screen;}public void setScreen(String screen) {this.screen screen;}public String getMemory() {return memory;}public void setMemory(String memory) {this.memory memory;}public String getMainboard() {return mainboard;}public void setMainboard(String mainboard) {this.mainboard mainboard;}Overridepublic String toString() {return Phone{ cpu cpu \ , screen screen \ , memory memory \ , mainboard mainboard \ };} }public class Client {public static void main(String[] args) {//构建Phone对象Phone phone new Phone(intel,三星屏幕,金士顿,华硕);System.out.println(phone);} } 上面在客户端代码中构建Phone对象传递了四个参数如果参数更多呢代码的可读性及使用的成本就是比较高。 重构后代码 public class Phone {private String cpu;private String screen;private String memory;private String mainboard;private Phone(Builder builder) {cpu builder.cpu;screen builder.screen;memory builder.memory;mainboard builder.mainboard;}public static final class Builder {private String cpu;private String screen;private String memory;private String mainboard;public Builder() {}public Builder cpu(String val) {cpu val;return this;}public Builder screen(String val) {screen val;return this;}public Builder memory(String val) {memory val;return this;}public Builder mainboard(String val) {mainboard val;return this;}public Phone build() {return new Phone(this);}}Overridepublic String toString() {return Phone{ cpu cpu \ , screen screen \ , memory memory \ , mainboard mainboard \ };} }public class Client {public static void main(String[] args) {Phone phone new Phone.Builder().cpu(intel).mainboard(华硕).memory(金士顿).screen(三星).build();System.out.println(phone);} } 重构后的代码在使用起来更方便某种程度上也可以提高开发效率。从软件设计上对程序员的要求比较高。 4.6 创建者模式对比 4.6.1 工厂方法模式VS建造者模式 工厂方法模式注重的是整体对象的创建方式而建造者模式注重的是部件构建的过程意在通过一步一步地精确构造创建出一个复杂的对象。 我们举个简单例子来说明两者的差异如要制造一个超人如果使用工厂方法模式直接产生出来的就是一个力大无穷、能够飞翔、内裤外穿的超人而如果使用建造者模式则需要组装手、头、脚、躯干等部分然后再把内裤外穿于是一个超人就诞生了。 4.6.2 抽象工厂模式VS建造者模式 抽象工厂模式实现对产品家族的创建一个产品家族是这样的一系列产品具有不同分类维度的产品组合采用抽象工厂模式则是不需要关心构建过程只关心什么产品由什么工厂生产即可。 建造者模式则是要求按照指定的蓝图建造产品它的主要目的是通过组装零配件而产生一个新产品。 如果将抽象工厂模式看成汽车配件生产工厂生产一个产品族的产品那么建造者模式就是一个汽车组装工厂通过对部件的组装可以返回一辆完整的汽车。 非常感谢您阅读到这里创作不易如果这篇文章对您有帮助希望能留下您的点赞 关注 收藏 评论感谢支持 听说 三连能够给人 带来好运更有可能年入百w进入大厂上岸
http://www.zqtcl.cn/news/228381/

相关文章:

  • 室内设计者联盟官网哈尔滨百度搜索排名优化
  • 网站公司打电话来说做网站天下信息网
  • 汕头制作企业网站百度舆情监测平台
  • 怎样跟网站做优化呢火狐搜索引擎
  • 如何做网站的维护和推广水利网站建设管理汇报
  • 申请网站就是做网站吗怎样凡科建设网站
  • 怎样做吓人网站网页制作成品图
  • 前端的网站重构怎么做做网站用的编程语言
  • 长沙网站设计多少钱一个月百度网盘app下载安装电脑版
  • 你好南京网站网站开发 seo
  • wordpress 文章延时加载seo软件系统
  • 网站建设与运营答案新浪网站首页
  • 网站怎么做关键词库如何建免费的企业网站
  • 跟老外做网站网络系统管理与维护机考
  • 网站推广方案范例江西南昌小程序开发
  • 烘焙类网站开发时代背景ppt素材模板免费下载
  • 如何制作多网页网站广州品牌seo推广
  • 域名怎么解析到网站什么是asp网站
  • 网站开发的税率做网站文案
  • 网站模板上传工具如何介绍自己设计的网页
  • 河北网站建设价格低国内做外单的网站有哪些
  • wordpress Apache升级优化营商环境的意义
  • 单页式网站系统wordpress自定义字段怎么用
  • 南宁网站设计要多少钱修改wordpress中的 功能 小工具
  • 南昌高端网站开发费用表域名价格排行
  • 怎么接网站开发外包中国观鸟记录的网站架构
  • 青海省住房和城乡建设厅的官方网站网站举报能不能查到举报人
  • dw做的网站如何上传云服务器网址生成app一键生成器
  • 山西建设厅网站密钥房山营销型网站建设
  • 网站空间多少钱哪里接单做网站