精华内容
下载资源
问答
  • 更多相关内容
  • 走穿java23种设计模式-5原型模式

    千次阅读 热门讨论 2017-10-07 07:28:09
    走穿java23种设计模式-5原型模式原型模式很多人对这个设计模式也是不熟悉的。因为用得也是不多,原型模式一般用于多次创建一个类的对象,获取多个这个类的对象,并进行相应的操作,一般做法是多次new出来,但是原型...

    走穿java23种设计模式-5原型模式

    原型模式很多人对这个设计模式也是不熟悉的。因为用得也是不多,原型模式一般用于多次创建一个类的对象,获取多个这个类的对象,并进行相应的操作,一般做法是多次new出来,但是原型模式是复制第一次创建的对象,然后通过多次复制得到多个对象。这种需求可能在现实需求中比较少,但是了解多一点没什么错。。。

    原型模式的现实场景

    比如要通知几十个客户有买车的实惠信息。
    你不会笨到一个个客户去给他单独的写邮件和邮件里面的信息吧。
    好一点的做法就是写好一封邮件内容,发给第一个客户。
    如果内容发送正常,就上一次发送的邮件信息转发或复制給剩下的几十个客户的邮箱里面。
    上面就是一次原型模式的模拟情况。

    原型模式的定义

    用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

    原型模式的类图

    1

    原型模式设计到三种角色

    1.客户角色

    该角色提出创建对象的请求。

    2.抽象原型角色

    该角色是一个抽象角色,通常由一个java接口或抽象类实现,给出所有的具体原型类所需要的接口。

    3.具体原型角色

    该角色是被复制的对象,必须实现抽象原型接口。

    原型模式的优点/缺点

    1.性能优化

    原型模式使对内存中二进制流的拷贝,要比直接new一个对象性能好,特别使当一个循环体内产生大量的对象时,原型模式可以更好地体现其优点。

    2.逃避构造函数的约束。

    这既是优点,也是缺点,直接在内存中拷贝对象,构造函数是不会执行的,因此减少了约束,但是也有可能造成没有对一些数据继续必要的初始化,这一点要在实际应用中进行权衡考虑。

    原型模式的应用场景

    1.资源优化场景。

    类初始化时需要消化非常多的资源,这个资源包括数据、硬件资源等等,原型模式就能跳过这些步骤。

    2.性能和安全要求的场景。

    如果通过new来产生一个对象需要非常繁琐的数据准备和访问权限,则可以通过原型模式。

    3.一个对象多个修改者的场景。

    一个对象需要提供給其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑原型模式拷贝多个对象供调用者使用。

    java克隆对象

    java中内置了克隆机制。Object类具有一个clone()方法,能够实现对象的克隆。
    使一个类支持克隆只需要两步。

    1.实现接口Cloneable类

    2.覆盖Object的clone()方法,完成对象的克隆操作,通常只需要调用Object的clone()方法即可。

    为了使外部能够调用此类的clone()方法,可以将访问修饰符改为public。

    原型设计模式的实例

    这里就以通知多个客户的情况做示例。

    原型模式实例类图

    1

    各个接口/类的代码

    1.抽象原型角色接口:Cloneable

    这是系统的接口类,直接实现它就可以了

    2.具体原型角色:Email

    package p5_prototype;
    
    
    /**
     * 继承了Cloneable 接口的类
     * 用于完成对象的复制
     * 完成通过自身对象复制出一个新的对象
     */
    public class Email implements Cloneable {
        //邮件的基本信息
        private String receiver;//邮件的接收人
        private String title;//邮件标题
        private String contxt;//邮件内容
    
        /**
         * 构造方法
         */
        public Email(String title, String contxt) {//因为标题和内容一样
            this.title = title;
            this.contxt = contxt;
    
        }
    
        /**
         * 克隆方法
         * 克隆对象的具体实现
         * 覆盖掉原本的clone方法
         * 通过自身对象调用clone方法,可以得到新的对象
         */
        public Email clone() {
            Email email = null;
            try {
                email = (Email) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return email;
    
        }
    
    
        //get和set方法,不管是new出来的对象还是复制出来的对象都是可以调用下面的方法
        public String getReceiver() {
            return receiver;
        }
    
        public void setReceiver(String receiver) {
            this.receiver = receiver;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getContxt() {
            return contxt;
        }
    
        public void setContxt(String contxt) {
            this.contxt = contxt;
        }
    }
    
    

    3.客户角色:BenzClient

    package p5_prototype;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 原型的客户,接手邮件
     */
    public class BenzClient {
    
        List<String> receiverList = new ArrayList<String>();//要发送的收件人的集合
    
        /**
         * 在集合中添加收件人
         */
        public List<String> getEmeilList() {
            receiverList.add("李先生");
            receiverList.add("梁小姐");
            receiverList.add("习先生");
            receiverList.add("大飞机");
            return receiverList;
        }
    
        /**
         * 发送邮件的方法
         * 模拟发送。。。
         */
        public void sendEmail(Email email) {
            System.out.println("发送邮件給:" + email.getReceiver() + ",标题:" + email.getTitle() + ",内容:" + email.getContxt());
        }
    }
    
    

    我这里是把客户群体当成是一个对象。

    4.原型模式的调用类:PrototypeDemo

    
    package p5_prototype;
    
    /**
     * 原型模式的调用者,客户
     */
    public class PrototypeDemo {
    
    
        public static void main(String[] srgs) {
            //创建一个Email原型,用来被复制
            Email email = new Email("买车优惠活动", "十一期间买车就送一个超级大娃娃");
            BenzClient client = new BenzClient();//客户对象,接收邮件
            //給所有用户发送邮件
            int num = client.getEmeilList().size();//客户的个数
            for (int i = 0; i < num; i++) {
                Email copyEmail = email.clone();//根据对象复制新的对象
                String receiver = client.getEmeilList().get(i);//获取集合中的收件人
                copyEmail.setReceiver(receiver);//給邮件添加收件人
                client.sendEmail(copyEmail);//发送邮件
            }
    
    
        }
    
    
    }
    
    

    程序运行结果:

    2

    之前也详细介绍过了java设计模式中的其他四种创建型模式:

    建造者模式:http://blog.csdn.net/wenzhi20102321/article/details/78163855

    抽象工厂模式:http://blog.csdn.net/wenzhi20102321/article/details/78153437
    工厂方法模式:http://blog.csdn.net/wenzhi20102321/article/details/78129065
    可以仔细对比一下工厂方法模式和抽象工厂模式,看看概念,看看类图,看看代码,就会明白了。

    单例模式:http://blog.csdn.net/wenzhi20102321/article/details/77882203

    java 23种设计模式介绍:http://blog.csdn.net/wenzhi20102321/article/details/54601909

    国庆假期马上就要结束了。。。

    共勉:争取更加美好的未来。

    展开全文
  • 23种设计模式Java实现

    千次下载 热门讨论 2012-12-02 00:59:26
    Java实现的23种设计模式,完整的代码,本想无积分下载来着,后来一想还是设置点儿把,毕竟我不喜欢不劳而获的思想,希望每个TX在下载别人的资源的同时,也积极上传资源与他人一起分享!
  • java23种设计模式概述总结

    千次阅读 2021-02-01 14:31:07
    软件设计模式的意义: 它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。 可以提高程序员的思维能力...

    软件设计模式的意义:

    它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。

    • 可以提高程序员的思维能力、编程能力和设计能力。
    • 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
    • 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。

    软件设计模式的基本要素:

    • 模式名称
    • 问题该模式的应用环境
    • 别名、动机、
    • 解决方案组成成分、它们之间的相互关系及各自的职责和协作方式
    • 效果(模式的优缺点。主要是对时间和空间的衡量以及该模式对系统的灵活性、扩充性、可移植性的影响
    • 结构、模式角色、合作关系、实现方法、适用性、已知应用、例程、模式扩展和相关模式

    设计模式有两种分类方法,即根据模式的目的来分和根据模式的作用的范围来分。

    1. 根据目的来分

    根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种

    1. 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。
    2. 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。
    3. 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。

    2. 根据作用范围来分

    根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。

    1. 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF中的工厂方法、(类)适配器、模板方法、解释器属于该模式。
    2. 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF 中除了以上 4 种,其他的都是对象模式。

     

     

    3. GoF的23种设计模式的功能

    前面说明了 GoF 的 23 种设计模式的分类,现在对各个模式的功能进行介绍。

    1. 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。https://blog.csdn.net/pshdhx/article/details/113516802
    2. 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。https://blog.csdn.net/pshdhx/article/details/113523244
    3. 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。https://blog.csdn.net/pshdhx/article/details/113557607  https://blog.csdn.net/pshdhx/article/details/113547996
    4. 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
    5. 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
    6. 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
    7. 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
    8. 桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
    9. 装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能。
    10. 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
    11. 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。
    12. 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
    13. 模板方法(TemplateMethod)模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
    14. 策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
    15. 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
    16. 职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
    17. 状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力。
    18. 观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
    19. 中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
    20. 迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
    21. 访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
    22. 备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
    23. 解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。
    展开全文
  • 23种设计模式详解,23种又可以分为3大类创建模式结构模式行为模式。后台开发利器
  • java23种设计模式一(连载)

    千次阅读 2012-11-12 13:26:56
    《Design pattern》一书中首次提出了23种设计模式,倘若你想成为编程高手,就必须要学习设计模式。   以下列出《Design pattern》一书中描述的23种设计模式,它们分别是: 1、适配器模式 2、外

    设计模式概要

            设计模式,顾名思义,它是一种模式,在面向对象中,它运用类与它们的方法来达到目标。使用它便于代码的可重用和可读性,有利于系统的维护。Design pattern》一书中首次提出了23种设计模式倘若你想成为编程高手,就必须要学习设计模式

            以下列出《Design pattern》一书中描述的23种设计模式,它们分别是:

    1、适配器模式

    2、外观模式

    3、合成模式

    4、桥接模式

    5、单例模式

    6、观察者模式

    7、调停者模式

    8、代理模式

    9、责任链模式

    10、享元模式

    11、构建者模式

    12、工厂方法模式

    13、抽象工厂模式

    14、原型模式

    15、备忘录模式

    16、模板方法模式

    17、状态模式

    18、策略模式

    19、命令模式

    20、解释器模式

    21、装饰器模式

    22、迭代器模式

    23、访问者模式

    以下分别介绍这23种设计模式

    一、适配器模式

            所谓适配器模式,是指将一个类适配成用户所期待的,它通常分为两大类:类适配器和对象适配器。

            类适配器

            这种适配器模式下,适配器继承自已实现的类(一般多重继承)。

          具体来说,我们需要实现目标接口,并继承自现有类,来达到用户所期望的效果具体实现如下:

        package cn.com.pattern;  
          
        //目标抽象角色,用户需要的是有圆形的usb接口  
        public interface Target {  
            public void provideCircleUsb();  
        }  
        package cn.com.pattern;  
        //源角色,这里是指提供方形的usb接口  
        public class Adaptee {  
            public void provideSquareUsb(){  
                System.out.println("我提供方形的USB接口");  
            }  
        }  
        package cn.com.pattern;  
        //适配角色,这里指老板买给我们的那个转换器  
        public class Adapter extends Adaptee implements Target{  
            @Override  
            //转换器将圆形的接口转换为方形接口  
            public void provideCircleUsb() {  
                this.provideSquareUsb();  
            }  
        }  
        package cn.com.pattern;  
          
        //客户端,也就是问题中的键盘  
        public class Client {  
            public static void main(String[] args) {  
                Target target=new Adapter();  
                //键盘只能使用圆形的USB接口  
                target.provideCircleUsb();  
            }  
          
        }  


           对象适配器

           在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。当你需要适配的一组方法并非定义在接口中时,就可以创建一个对象适配器,采用对象方式实现:

    package cn.com.pattern;
    public class Adapter implements Target{  
           private Adaptee adptee;  
           public Adapter(Adaptee adptee){  
              this.adptee=adptee;  
              }  
               
            @Override  
        //转换器将圆形的接口转换为方形接口  
        public void provideCircleUsb() {  
            adptee.provideSquareUsb();  
        }  


    展开全文
  • 注:已经延期好久好久了,从去年11月份到今年8月份,卧槽,不敢想啊,博主真是没时间整...23种设计模式代码案列大全>,学习之,能敲出骇世惊俗的代码;不信吗,若不信的话,那是你没有真正掌握其中的思想精髓; ...
  • Java开发中的23种设计模式详解

    万次阅读 多人点赞 2019-01-25 11:28:26
    Java开发中的23种设计模式详解
  • public class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light=light; } @Override public void execute() { // TODO Auto-generated method...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,032,199
精华内容 412,879
关键字:

java23种设计模式

java 订阅