A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 CatchException 于 2017-11-17 12:54 编辑

    设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
    使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。        ----百度百科

下面开始总结:
单例设计模式
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。
分为饿汉式和懒汉式,由于饿汉式没有过多需要注意的地方,故忽略。下文为懒汉式:
[Java] 纯文本查看 复制代码
public class SingleDemo {
        //将实例静态私有,并置为空,目的是为了延迟加载
        private static SingleDemo instance = null;
        //将构造方法私有,防止被创建实例
        private SingleDemo(){}
        
        //创建实例并返回
        public static SingleDemo getInstance(){
                if(instance == null){
                        synchronized (instance) {
                                if(instance == null){
                                        instance = new SingleDemo();
                                }
                        }
                }
                return instance;
        }
以上的双重if判断是为了提高性能,如果没有外层的if,那么每个线程进来都要拿到一次锁,才可以进行判断此时instance是否为空,如果是非空的,会立即释放锁,这是一个非常消耗系统资源的过程,所以在每个线程进来时先进行一次判断,如果非空,就没必要去拿到锁,而是直接将现有的实例返回。
工厂设计模式

工厂模式分为三种:
  1、普通工厂
  2、多个工厂
  3、静态工厂
1、普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
我们举一个生产手机的例子。把所有的手机放在一个工厂里面去生产。
[Java] 纯文本查看 复制代码
package com.itheima.factory;

//创建手机共同的接口
public interface Phone{
        public void call();
}

//创建不同手机生产的实现类
public class Mi implements Phone{
        @Override
        public void call() {
                System.out.println("小米手机call...");
        }
}
public class HuaWei implements Phone{
        @Override
        public void call() {
                System.out.println("华为手机call...");
        }
}
//最后创建工厂类
public class PhoneFactory {
        public Phone make(String phone){
                if("Mi".equals(phone)){
                        return new Mi();
                }else if("HuaWei".equals(phone)){
                        return new HuaWei();
                }else{
                        System.out.println("请输入正确的手机型号");
                }
        }
}

//我们来测试下
public class FactoryTest{
        public static void main(String[] args) {
                PhoneFactory pf = new PhoneFactory();
                Phone phone = pf.make("Mi");
                phone.call();
        }
}

输出结果:小米手机call...
2、多个工厂方法模式是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
以上代码不做修改,只把PhoneFactory修改一下
[Java] 纯文本查看 复制代码
public class MoreFactory {
        //生产小米手机的工厂方法
        public Phone makeMi(){
                return new Mi();
        }
        //生产华为手机的工厂方法
        public Phone makeHuaWei(){
                return new HuaWei();
        }
}
测试一下
[Java] 纯文本查看 复制代码
public class FactoryTest(){
        MoreFactory mf = new MoreFactory();
        Phone phone = mf.makeHuaWei();
        phone.call();
}
输出结果:华为手机call...
3.静态工厂模式:就是将上述两个生产方法加上static关键字修饰,即在使用时不需要创建工厂对象,直接用类名调用即可。此处不再举例
抽象工厂设计模式
    工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这些工厂实现同一个总工厂的接口。这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
[Java] 纯文本查看 复制代码
package com.itheima.factory;

//创建手机共同的接口
public interface Phone{
        public void call();
}
//创建手机生产工厂需要实现的总工厂接口
public interface Factory {
 public Phone make();
}
//创建不同手机生产的实现类
public class Mi implements Phone{
        @Override
        public void call() {
                System.out.println("小米手机call...");
        }
}
public class HuaWei implements Phone{
        @Override
        public void call() {
                System.out.println("华为手机call...");
        }
}
//小米生产工厂
public class MiFactory implements Factory{
 @Override
 public Phone make() {
  return new Mi();
 }
}
//华为生产工厂
public class HuaWeiFactory implements Factory{
 @Override
 public Phone make() {
  return new HuaWei();
 }
}

//测试一下
public class FactoryTest(){
 Factory factory = new MiFactory();
 Phone phone = factory.make();
 phone.call();
}
输出结果:小米手机call...
这个模式的好处就是,如果你现在想生产一个新手机:iPhone,则只需做一个实现类,实现Phone接口,同时做一个工厂类,实现Factory接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!
装饰者模式

装饰器模式的应用场景:
    1、需要扩展一个类的功能。
    2、动态的为一个对象增加功能,而且还能动态撤销。(动态的增强一个类中需要增强的方法)
必要条件:
    * 包装对象和被包装的对象都要实现相同的接口.

    * 包装的对象中需要获得到被包装对象的引用.

缺点:如果接口的方法比较多,增强其中的某个方法.其他的功能的方法需要原有调用.
举个例子:现在的服务员类中有一个服务的方法(输出:服务...),我们想对这个服务方法加以增强(输出:微笑服务...)。
[Java] 纯文本查看 复制代码
//包装类和被包装类需要实现的同一个接口
public interface Waiter{
        public void server();
}

public class Waiteress implements Waiter{
        @Override
        public void server() {
                System.out.println("服务...");
        }
}
public class WaiteressWrapper implements Waiter{
    private Waiter waiter;
        public WaiteressWrapper(Waiter waiter) {
              this.waiter = waiter;
        }
        @Override
        public void server() {
                System.out.print("微笑");
                 this.waiter.server();
        }
}[/align][align=left]//测试一下[/align][align=left]public class DecoratorTest {
 public static void main(String[] args) {
  Waiter waiter = new WaiteressWrapper(new Waiteress());
  waiter.server();
 }
}
输出结果:微笑服务...
以上为目前学习到的三种设计模式,以后还会有很多种设计模式

12 个回复

倒序浏览
回复 使用道具 举报
大神厉害
回复 使用道具 举报
厉害
回复 使用道具 举报
总结的不错{:8_474:}
回复 使用道具 举报
大黑黑 发表于 2017-11-18 11:51
总结的不错

谢谢
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
fashionkillyou 发表于 2017-11-18 00:05
大神厉害

要说大神,还是我明哥
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
张大仙 发表于 2017-11-18 09:50
大神厉害

过奖啦,就是对着之前学的总结了一下
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
李龙菲 发表于 2017-11-18 10:46
厉害

阿菲别生气啦
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报

生啥气
回复 使用道具 举报
heimalala 来自手机 中级黑马 2017-11-20 00:40:17
11#
暗中学习
回复 使用道具 举报
回复 使用道具 举报
总结的很好!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马