Java笔记(25):设计模式概述

1、设计模式的概述和分类

设计模式:
经验的总结。

A:创建型 创建对象
B:结构型 对象的组成
C:行为型 对象的功能

创建型模式:
1)简单工厂模式
2)工厂方法模式
3)设计模式

2、简单工厂模式概述和使用

1 package cn.itcast_01;
2 
3 public abstract class Animal {
4     public abstract void eat();
5 }
1 package cn.itcast_01;
2 
3 public class Cat extends Animal {
4     @Override
5     public void eat() {
6         System.out.println("猫吃鱼");
7     }
8 }
1 package cn.itcast_01;
2 
3 public class Dog extends Animal {
4     @Override
5     public void eat() {
6         System.out.println("狗吃肉");
7     }
8 }
 1 package cn.itcast_01;
 2 
 3 public class AnimalFactory {
 4 
 5     private AnimalFactory() {
 6     }
 7 
 8     // public static Dog createDog() {
 9     // return new Dog();
10     // }
11     //
12     // public static Cat createCat() {
13     // return new Cat();
14     // }
15 
16     public static Animal createAnimal(String type) {
17         if ("dog".equals(type)) {
18             return new Dog();
19         } else if ("cat".equals(type)) {
20             return new Cat();
21         } else {
22             return null;
23         }
24     }
25 }
 1 package cn.itcast_01;
 2 
 3 public class AnimalDemo {
 4     public static void main(String[] args) {
 5         // 具体类调用
 6         Dog d = new Dog();
 7         d.eat();
 8         Cat c = new Cat();
 9         c.eat();
10         System.out.println("------------");
11 
12         // 工厂有了后,通过工厂给造
13         // Dog dd = AnimalFactory.createDog();
14         // Cat cc = AnimalFactory.createCat();
15         // dd.eat();
16         // cc.eat();
17         // System.out.println("------------");
18 
19         // 工厂改进后
20         Animal a = AnimalFactory.createAnimal("dog");
21         a.eat();
22         a = AnimalFactory.createAnimal("cat");
23         a.eat();
24 
25         // NullPointerException
26         a = AnimalFactory.createAnimal("pig");
27         if (a != null) {
28             a.eat();
29         } else {
30             System.out.println("对不起,暂时不提供这种动物");
31         }
32     }
33 }

3、工厂方法模式的概述和使用

1 package cn.itcast_02;
2 
3 public abstract class Animal {
4     public abstract void eat();
5 }
1 package cn.itcast_02;
2 
3 public interface Factory {
4     public abstract Animal createAnimal();
5 }
 1 package cn.itcast_02;
 2 
 3 public class AnimalDemo {
 4     public static void main(String[] args) {
 5         // 需求:我要买只狗
 6         Factory f = new DogFactory();
 7         Animal a = f.createAnimal();
 8         a.eat();
 9         System.out.println("-------");
10         
11         //需求:我要买只猫
12         f = new CatFactory();
13         a = f.createAnimal();
14         a.eat();
15     }
16 }
 1 package cn.itcast_02;
 2 
 3 public class Cat extends Animal {
 4 
 5     @Override
 6     public void eat() {
 7         System.out.println("猫吃鱼");
 8     }
 9 
10 }
 1 package cn.itcast_02;
 2 
 3 public class CatFactory implements Factory {
 4 
 5     @Override
 6     public Animal createAnimal() {
 7         return new Cat();
 8     }
 9 
10 }
 1 package cn.itcast_02;
 2 
 3 public class Dog extends Animal {
 4 
 5     @Override
 6     public void eat() {
 7         System.out.println("狗吃肉");
 8     }
 9 
10 }
 1 package cn.itcast_02;
 2 
 3 public class DogFactory implements Factory {
 4 
 5     @Override
 6     public Animal createAnimal() {
 7         return new Dog();
 8     }
 9 
10 }

4、单例模式之饿汉式

 1 package cn.itcast_03;
 2 
 3 public class Student {
 4     // 构造私有
 5     private Student() {
 6     }
 7 
 8     // 自己造一个
 9     // 静态方法只能访问静态成员变量,加静态
10     // 为了不让外界直接访问修改这个值,加private
11     private static Student s = new Student();
12 
13     // 提供公共的访问方式
14     // 为了保证外界能够直接使用该方法,加静态
15     public static Student getStudent() {
16         return s;
17     }
18 }
 1 package cn.itcast_03;
 2 
 3 /*
 4  * 单例模式:保证类在内存中只有一个对象。
 5  * 
 6  * 如何保证类在内存中只有一个对象呢?
 7  *         A:把构造方法私有
 8  *         B:在成员位置自己创建一个对象
 9  *         C:通过一个公共的方法提供访问
10  */
11 public class StudentDemo {
12     public static void main(String[] args) {
13         // Student s1 = new Student();
14         // Student s2 = new Student();
15         // System.out.println(s1 == s2); // false
16 
17         // 通过单例如何得到对象呢?
18 
19         // Student.s = null;
20 
21         Student s1 = Student.getStudent();
22         Student s2 = Student.getStudent();
23         System.out.println(s1 == s2);
24 
25         System.out.println(s1); // null,cn.itcast_03.Student@175078b
26         System.out.println(s2);// null,cn.itcast_03.Student@175078b
27     }
28 }

5、单例模式之懒汉式

 1 package cn.itcast_03;
 2 
 3 /*
 4  * 单例模式:
 5  *         饿汉式:类一加载就创建对象
 6  *         懒汉式:用的时候,才去创建对象
 7  * 
 8  * 面试题:单例模式的思想是什么?请写一个代码体现。
 9  * 
10  *         开发:饿汉式(是不会出问题的单例模式)
11  *         面试:懒汉式(可能会出问题的单例模式)
12  *             A:懒加载(延迟加载)    
13  *             B:线程安全问题
14  *                 a:是否多线程环境    是
15  *                 b:是否有共享数据    是
16  *                 c:是否有多条语句操作共享数据     是
17  */
18 public class Teacher {
19     private Teacher() {
20     }
21 
22     private static Teacher t = null;
23 
24     public synchronized static Teacher getTeacher() {
25         // t1,t2,t3
26         if (t == null) {
27             //t1,t2,t3
28             t = new Teacher();
29         }
30         return t;
31     }
32 }
 1 package cn.itcast_03;
 2 
 3 public class TeacherDemo {
 4     public static void main(String[] args) {
 5         Teacher t1 = Teacher.getTeacher();
 6         Teacher t2 = Teacher.getTeacher();
 7         System.out.println(t1 == t2);
 8         System.out.println(t1); // cn.itcast_03.Teacher@175078b
 9         System.out.println(t2);// cn.itcast_03.Teacher@175078b
10     }
11 }

6、单例模式的Java代码体现Runtime类

 1 package cn.itcast_03;
 2 
 3 import java.io.IOException;
 4 
 5 /*
 6  * Runtime:每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。
 7  * exec(String command)
 8  */
 9 public class RuntimeDemo {
10     public static void main(String[] args) throws IOException {
11         Runtime r = Runtime.getRuntime();
12 //        r.exec("winmine");
13         // r.exec("notepad");
14         // r.exec("calc");
15 //        r.exec("shutdown -s -t 10000");
16         r.exec("shutdown -a");
17     }
18 }
19 
20 /*
21  * class Runtime {
22  *         private Runtime() {}
23  *         private static Runtime currentRuntime = new Runtime();
24  *         public static Runtime getRuntime() {
25  *           return currentRuntime;
26  *       }
27  * }
28  */

 

posted @ 2017-06-16 14:49  花醉红尘  阅读(183)  评论(0编辑  收藏  举报