黑马程序员-Java的设计模式

原创 2015年11月19日 09:59:38


                                            -----------android培训、java培训、java学习型技术博客、期待与您交流!------------

                                                                               Java中设计模式的初步学习

一、设计模式(范式):
    解决某一类问题的最行之有效的方法。
   (1)从高效合理开发的思想考虑;   (2)框架:复杂的设计模式;
   (3)java中已经总结了23中设计模式;

二、单例设计模式:解决一个类在内存只存在一个对象。
    当在不同的地方想操作同一个对象时,这种单子的设计模式相当的棒。
    例如:不同的两个类A和B,都要操作配置文件,就可以利用单子的C类的设计模式实现。

1、对象唯一性:
  (1)为了避免其他程序过多建立该类的对象,禁止其他程序建立该类对象;
  (2)为了让其他程序可以访问该类的对象,在本类中,自定义一个对象;
  (3)为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

2、单例模式的实现
  (1)将构造函数私有化;
  (2)在类中创建一个本类对象;
  (3)提供一个方法可以获取到对象。
  (4)对事物用类正常描述,当需要将该事物保证在内存中唯一使,
       就将以上的三步加上即可。

3、饿汉式和懒汉式
       虽然对象的的创建时间不一样,但是,都是为了要使用这个唯一的
   对象,所以差别不是特别大。
        但是,懒汉式在判断创建对象时,不是原子操作,容易引起两个程序
   同时调用时,创建不同的对象,所以一般使用饿汉式。

 

/*饿汉式:先初始化对象;
SingleMode一进内存,就已经创建好了方法区中sm指向的
堆内存中对象;
*/

class SingleMode {
	private int num;

	private SingleMode(){}

	private static SingleMode sm = new SingleMode();

	public static SingleMode getInstance() 
	{
		return sm;
	}

	public void setNum(int num){
		this.num = num;
	}

	public int getNum(){
		return num;
	}
}

public class SingleModeDemo{
	public static void main(String[] args){
		
		SingleMode s1 = SingleMode.getInstance();
		SingleMode s2 = SingleMode.getInstance();
		
		s1.setNum(30);
		System.out.println(s2.getNum());
		
		System.out.println(s1==s2);
	}
}

 


/*懒汉式:延迟加载,对象是方法被调用时才初始化;
  SingleMode类进内存,对象还没有存在,只有调用
  getImstance()方法时,才在堆中建立对象。
*/


class SingleMode {
	private int num;

	private SingleMode(){}

	private static SingleMode sm = null;

	public static  SingleMode getInstance() 
	{
		if(sm == null)//A和B两个线程同时调用时,容易产生问题,创建不同的对象
			sm = new SingleMode();
		return sm;
	}

	/*
    public static  synchronized SingleMode getInstance() //每次判断,效率比较低
	{
		if(sm == null)
			sm = new SingleMode();
		return sm;
	}
	*/

	/*
	public static  synchronized SingleMode getInstance()
	{
		 -->C线程执行到这里
		if(sm == null){
			-->B线执行到这里,因为锁,停在了这里
			synchronized (SingleMode.class){ //减少了读锁的次数
				if(sm == null)//防止B进来后,判断出现错误
                    -->A线程停在了这里
					sm = new SingleMode();
			}
		}
		return sm;
	}
	*/
	

	public void setNum(int num){
		this.num = num;
	}

	public int getNum(){
		return num;
	}
}

public class SingleModeDemo2{
	public static void main(String[] args){
		
		SingleMode s1 = SingleMode.getInstance();
		SingleMode s2 = SingleMode.getInstance();
		
		s1.setNum(30);
		System.out.println(s2.getNum());
		
		System.out.println(s1==s2);
	}
}

4、通过继承简化单例模式

class Student {

	private int age;
	private String name;

	public  Student(){
		System.out.println("Student construtor() 1");
	}

	public  Student(String name ,int age){
		System.out.println("Student construtor() 2");
		this.name = name;
		this.age  = age;
	}

	public void  setAge(int age){
		this.age = age;
	}

	public int  getAge(){
		return age;
	}

	public void setName(String name){
		this.name = name;
	}

	public String getName(){
		return name;
	}

	public static void main(String[] args) 
	{
		System.out.println("Hello World!");
	}
}

class SpecialStudent extends Student{
	private SpecialStudent(){
		super("li",30);
	}

	private static  SpecialStudent ss = new SpecialStudent();

	public static SpecialStudent getInstance(){
		return ss;
	}
}

public class  SingleModeDemo3{

	public static void  main(String[] args){
		SpecialStudent s1 = SpecialStudent.getInstance();
		SpecialStudent s2 = SpecialStudent.getInstance();

		//s1.setAge(20);
		System.out.println(s2.getAge());
	}
}


 


三、抽象工厂模式
        为了解决工厂方法模式中,如果想要拓展程序功能,就必须对工厂类直接进行
    修改,这个违反了闭包原则的问题.
        利用工厂类接口实现创建多个不同功能的工厂类,当需要增加一个功能时,
    只需要做一个实现类和基于工厂类接口的实现的工厂类,就可以在不改变原有代码
    的基础上,实现功能拓展。

      

//抽象工厂模式

public interface Sender {  
    public void Send();  
}  
 
 
//两个实现类:

public class MailSender implements Sender {  
	@Override  
	public void Send() {  
		System.out.println("this is mailsender!");  
    }  
 }  
 

public class SmsSender implements Sender {  
 
	@Override  
	public void Send() {  
		System.out.println("this is sms sender!");  
	}  
}  

//新的功能实现类
public class WeChatSender implements Sender {  
 
	@Override  
	public void Send() {  
		System.out.println("this is wechat sender!");  
	}  
} 

//在提供一个接口:
public interface Provider {  
     public Sender produce();  
}
 
//两个工厂类:
public class SendMailFactory implements Provider {       
	@Override  
	public Sender produce(){  
		return new MailSender();  
    }  
 }  
 
public class SendSmsFactory implements Provider{  
	@Override  
    public Sender produce() {  
		return new SmsSender();  
    }  
} 

//新的功能的实现类的工厂类
public class SendWeChatFactory implements Provider{  
	@Override  
    public Sender produce() {  
		return new WeChatSender();  
    }  
}
 
//测试类:
public class AbstractFactroyModeTest {  
  
    public static void main(String[] args) {  
        Provider provider = new SendWeChatFactory();  
        Sender sender = provider.produce();  
        sender.Send();  
    }  
}  

 

四、模板方法模式
        在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,
    那么就将不确定的部分划分出去,有该类的子类去完成。

 

/*
需求:获取一段程序运行的时间。

思路:获取程序开始和结束的时间并相减即可。

当前时间获取:System.currentTimeMillis();
*/

abstract class RunTimeCount{
	//模板方法
	public  final  long  getTime(){
		long startTime = System.currentTimeMillis();
        
		runCode();

		long endTime = System.currentTimeMillis();

		return  (endTime-startTime);
	}

    //不确定的功能处理成一个方法
	public abstract void runCode();

}

class CodeRun extends RunTimeCount{
	public void runCode(){
		for(int i=0;i<1000;i++){
			System.out.print(i+" ");
		}
		System.out.println();
	}
}

public class  TemplateDemo
{
	public static void main(String[] args) 
	{
		CodeRun cr = new CodeRun();
		long rt = cr.getTime();
		System.out.println("runtie = "+rt);
	}
}



        总结,其他继承、组合和装饰器等也是一种设计合理类,可以使你对项目的扩展更佳
    容易和合理,通过重构从整体上重新优化项目内整体的结构;还有其他常用的设计模式,
    如工厂方法模式等等,应用这些都可以使用的开发更佳的高效和合理。

 

五、参考
    1、Java开发中的23种设计模式详解(转) http://blog.csdn.net/tansuozhey/article/details/50116047
    2、《设计模式:可复用面向对象软件的基础》 Erich Gamma、Richard Helm、Ralph Johnson和JohnVlissides著。

版权声明:本文为博主原创文章,未经博主允许不得转载。

程序员百度云干货 不谢~~~~~~

这是一些学习资源,里面有Android的,iOS的,PHP的,大数据的,Java的,web前端的,C++,Python的…. 有的来源地址是在一个公众号的群.感谢群主的分享.有的是我以前收集的.在...
  • settingSun66
  • settingSun66
  • 2017年02月06日 16:51
  • 17879

黑马程序员-------SQLServer数据库基础知识

---------------------- http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发、 http://edu.csdn.net...
  • guoguo_19900310
  • guoguo_19900310
  • 2014年01月12日 14:37
  • 1073

真实大起底:一名黑马程序员的就业经历

写在前面的话:首先说明一下,我是黑马程序员Java09期的一名毕业学员,目前就职于北京汇***宇科技有限公司,起步月薪:10000元/月(福利不计)。我大学所学的是计算机专业,2014年毕业后直接进入...
  • itcast_cn
  • itcast_cn
  • 2016年05月17日 11:44
  • 11148

黑马程序员-Java基础:设计模式总结

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——Java基础部分设计模式一、设计模式概述 设计模式(Design pattern)是一套被反复使用、多数人知晓的、...
  • BlackHorseKevin
  • BlackHorseKevin
  • 2015年08月17日 19:26
  • 346

黑马程序员——JAVA基础之单列设计模式

------- android培训、java培训、期待与您交流! ----------   单列设计模式是面试中的一个常考的点,所谓单例模式就是说对象在内存中只能存在一个。如果有其他变量是...
  • run_wind
  • run_wind
  • 2014年11月25日 21:54
  • 278

黑马程序员 java基础—单例设计模式

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- 一 单例设计模式的特点 1.单例类在代码执行过...
  • Vip_cooling
  • Vip_cooling
  • 2014年03月29日 01:10
  • 684

黑马程序员_java语言_多线程和设计模式

------http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训a>、期待与您交流! ------- ###17....
  • sjw798056265
  • sjw798056265
  • 2015年06月04日 19:05
  • 296

黑马程序员-Java设计模式

------------------- android开发、java培训、期待与您交流! ---------------------- 单例设计模式:保证一个类在内存中的对象唯一性。 ...
  • sam9204
  • sam9204
  • 2014年06月08日 13:52
  • 232

黑马程序员__java设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于...
  • xy_xb
  • xy_xb
  • 2015年12月24日 23:47
  • 56

黑马程序员--java单列设计模式

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------...
  • wangwei19901213
  • wangwei19901213
  • 2015年07月17日 22:19
  • 126
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员-Java的设计模式
举报原因:
原因补充:

(最多只允许输入30个字)