项目作者: BillZhaoZ

项目描述 :
Java常见设计模式介绍、入门和简单实例讲解。(单例模式、观察者模式、原型模式、Builder模式)
高级语言: Java
项目地址: git://github.com/BillZhaoZ/AndroidDesignModel.git
创建时间: 2017-12-20T07:48:25Z
项目社区:https://github.com/BillZhaoZ/AndroidDesignModel

开源协议:

下载


DesignModel

设计模式

一、单例模式

  1. 1.普通单例模式
  2. /**
  3. * 单例模式
  4. * Created by Bill on 2017/12/15.
  5. */
  6. public class SigleInstance {
  7. public static void main(String[] args) {
  8. instanceOne();
  9. enmuSingleton instance = enmuSingleton.INSTANCE;
  10. }
  11. /**
  12. * 实例1
  13. */
  14. private static void instanceOne() {
  15. Company company = new Company();
  16. // ceo 只能通过getCEO 函数获取
  17. Staff ceoa1 = CEO.getCeo();
  18. Staff ceoa2 = CEO.getCeo();
  19. company.addStaff(ceoa1);
  20. company.addStaff(ceoa2);
  21. // 通过new 创建vp对象
  22. Staff vp1 = new VP();
  23. Staff vp2 = new VP();
  24. // 通过new 创建staff对象
  25. Staff staff1 = new Staff();
  26. Staff staff2 = new Staff();
  27. Staff staff3 = new Staff();
  28. company.addStaff(vp1);
  29. company.addStaff(vp2);
  30. company.addStaff(staff1);
  31. company.addStaff(staff2);
  32. company.addStaff(staff3);
  33. company.showAllStaff();
  34. }
  35. }
  36. 2.懒汉和饿汉
  37. /**
  38. * CEo
  39. * 饿汉单例模式
  40. * 声明对象时就已经初始化了
  41. */
  42. public class CEO extends Staff {
  43. public static final CEO mCeo = new CEO();
  44. // 构造函数私有化
  45. private CEO() {
  46. }
  47. // 公有的静态方法 对外暴露获取单利的接口
  48. public static CEO getCeo() {
  49. return mCeo;
  50. }
  51. @Override
  52. public void work() {
  53. super.work();
  54. // 管理vp
  55. }
  56. }
  57. /**
  58. * 懒汉模式
  59. * 声明一个静态对象,并且在第一次调用getInstance 方法时进行初始化
  60. * Created by Bill on 2017/12/15.
  61. */
  62. public class LazySingleInstance {
  63. private static LazySingleInstance lazySingleInstance;
  64. private LazySingleInstance() {
  65. }
  66. // 保证多线程下的安全
  67. public static synchronized LazySingleInstance getLazySingleInstance() {
  68. if (lazySingleInstance == null) {
  69. lazySingleInstance = new LazySingleInstance();
  70. }
  71. return lazySingleInstance;
  72. }
  73. }
  74. 3.double check lock
  75. /**
  76. * double check lock
  77. * <p>
  78. * 优点:资源利用高,第一次执行getInstance()方法才会实例化对象,效率高。
  79. * 缺点:第一次加载反应稍慢,也由于Java内存模型的原因偶尔会失败。
  80. * Created by Bill on 2017/12/16.
  81. */
  82. public class Singleton {
  83. private static Singleton singleton = null;
  84. private Singleton() {
  85. }
  86. public static Singleton getSingleton() {
  87. if (singleton == null) {
  88. synchronized (Singleton.class) { // 避免不必要的同步
  89. if (singleton == null) { // 在null的情况下创建实例
  90. singleton = new Singleton();
  91. }
  92. }
  93. }
  94. return singleton;
  95. }
  96. }
  97. 4.枚举单例
  98. /**
  99. * 枚举单例
  100. * 写法简单 默认枚举都是线程安全的 在任何情况下都是单例
  101. * Created by Bill on 2017/12/16.
  102. */
  103. public enum enmuSingleton {
  104. INSTANCE;
  105. public void doSomething() {
  106. System.out.println("do it!!!");
  107. }
  108. }
  109. 5.静态内部类
  110. /**
  111. * 静态内部类
  112. * Created by Bill on 2017/12/16.
  113. */
  114. public class InnerClassSingleton {
  115. private InnerClassSingleton() {
  116. }
  117. public static InnerClassSingleton getInstance() {
  118. return SingletonHolder.innerInstance;
  119. }
  120. /**
  121. * 静态内部类
  122. * 保证线程安全,也能保证单例对象的唯一性,同事也延迟加载了单利的实例化
  123. */
  124. private static class SingletonHolder {
  125. private static final InnerClassSingleton innerInstance = new InnerClassSingleton();
  126. }
  127. }
  128. 6.容器实现单例
  129. /**
  130. * 容器管理单例
  131. * <p>
  132. * 在程序初始化的时候,将多种单例模式注入到一个统一的管理类中,在使用的时候根据key获取对象对应类型的单例对像。
  133. * 这种方式是得我们可以管理多种单例,并且在使用的时候通过统一的接口进行获取操作,降低了用户的使用成本;
  134. * <p>
  135. * Created by Bill on 2017/12/16.
  136. */
  137. public class SingletonManger {
  138. private static Map<String, Object> objectMap = new HashMap<>();
  139. private SingletonManger() {
  140. }
  141. public static void registerService(String key, Object instance) {
  142. if (!objectMap.containsKey(key)) {
  143. objectMap.put(key, instance);
  144. }
  145. }
  146. public static Object getService(String key) {
  147. return objectMap.get(key);
  148. }
  149. }

二、Builder 模式

  1. 1.Product 产品类
  2. /**
  3. * 计算机抽象类
  4. * product角色
  5. * Created by Bill on 2017/12/16.
  6. */
  7. public abstract class Computer {
  8. private String mBoard;
  9. private String mDisplay;
  10. String mOS;
  11. protected Computer() {
  12. }
  13. // 设置CPU核心数
  14. public void setBoard(String board) {
  15. mBoard = board;
  16. }
  17. // 设置内存
  18. public void setDisplay(String display) {
  19. mDisplay = display;
  20. }
  21. // 设置操作系统
  22. public abstract void setOS();
  23. @Override
  24. public String toString() {
  25. return " My Computer:[ mBoard == " + mBoard + " ,mDisplay == " + mDisplay + " ,mOS" + mOS + "]";
  26. }
  27. }
  28. /**
  29. * 具体的Computer类
  30. * Created by Bill on 2017/12/16.
  31. */
  32. public class MacBook extends Computer {
  33. public MacBook() {
  34. }
  35. @Override
  36. public void setOS() {
  37. mOS = "Mac OS X 10.13";
  38. }
  39. }
  40. 2.Builder
  41. /**
  42. * 抽象Builder类
  43. * Created by Bill on 2017/12/16.
  44. */
  45. public abstract class Builder {
  46. public abstract void buildBoard(String board);
  47. public abstract void buildDisplay(String display);
  48. public abstract void buildOS();
  49. public abstract Computer create();
  50. }
  51. /**
  52. * 具体的Builder类
  53. * Created by Bill on 2017/12/16.
  54. */
  55. public class MacBookBuilder extends Builder {
  56. private Computer mComputer = new MacBook();
  57. @Override
  58. public void buildBoard(String board) {
  59. mComputer.setBoard(board);
  60. }
  61. @Override
  62. public void buildDisplay(String display) {
  63. mComputer.setDisplay(display);
  64. }
  65. @Override
  66. public void buildOS() {
  67. mComputer.setOS();
  68. }
  69. @Override
  70. public Computer create() {
  71. return mComputer;
  72. }
  73. }
  74. 3.Director
  75. /**
  76. * Director类,负责构建computer
  77. * Created by Bill on 2017/12/16.
  78. */
  79. public class Director {
  80. Builder mBuilder = null;
  81. public Director(Builder builder) {
  82. mBuilder = builder;
  83. }
  84. public void construct(String board, String display) {
  85. mBuilder.buildBoard(board);
  86. mBuilder.buildDisplay(display);
  87. mBuilder.buildOS();
  88. }
  89. }
  90. 4.使用
  91. /**
  92. * Builder 模式
  93. * <p>
  94. * 通过具体的MacBookBuilder来构建MacBook对像,而Director封装了构建复杂产品的过程,对外隐藏了细节。
  95. * Builder和Director一起,将一个复杂对象的构建和表示分开,使得同样的构建过程 可以创建不同的对对象。
  96. * <p>
  97. * Created by Bill on 2017/12/15.
  98. */
  99. public class BuilderModel {
  100. public static void main(String[] args) {
  101. // 实例1
  102. // 构建器
  103. MacBookBuilder builder = new MacBookBuilder();
  104. // Director 表示器
  105. Director director = new Director(builder);
  106. director.construct("英特尔主板", "Retina显示器");
  107. Computer computer = builder.create();
  108. System.out.println("Computer Info:" + computer.toString());
  109. // 例子2
  110. HuaShuoBuilder builder1 = new HuaShuoBuilder();
  111. Director director1 = new Director(builder1);
  112. director1.construct("华硕主板", "4K高端显示器");
  113. Computer computer1 = builder1.create();
  114. System.out.println("Computer Info:" + computer1.toString());
  115. }
  116. }

三、原型模式

  1. /**
  2. * 文档类型
  3. * WordDocument扮演的是concreatePrototype角色(具体的原型类)
  4. * 而cloneable是代表的prototype角色(抽象类或者接口,声明具备clone能力)
  5. * Created by Bill on 2017/12/20.
  6. */
  7. public class WordDocument implements Cloneable {
  8. private String mText;
  9. private ArrayList<String> mImages = new ArrayList<String>();
  10. public WordDocument() {
  11. System.out.println("========== WordDocument 构造函数 ==========");
  12. }
  13. @Override
  14. protected WordDocument clone() {
  15. WordDocument document = null;
  16. try {
  17. document = (WordDocument) super.clone();
  18. document.mText = this.mText;
  19. // 1.浅拷贝
  20. // document.mImages = this.mImages;
  21. // 2.深拷贝 拷贝对象时,对于引用形的字段,也采用拷贝的形式 而不是单纯的引用
  22. document.mImages = (ArrayList<String>) this.mImages.clone();
  23. } catch (CloneNotSupportedException e) {
  24. e.printStackTrace();
  25. }
  26. return document;
  27. }
  28. public void showDocu() {
  29. System.out.println("========== WordDocument start ==========");
  30. System.out.println("text: " + mText);
  31. System.out.println("image list: ");
  32. for (String image : mImages) {
  33. System.out.println("image name: " + image);
  34. }
  35. System.out.println("========== WordDocument end ==========");
  36. }
  37. public String getText() {
  38. return mText;
  39. }
  40. public void setText(String text) {
  41. mText = text;
  42. }
  43. public ArrayList<String> getImages() {
  44. return mImages;
  45. }
  46. public void setImages(String images) {
  47. this.mImages.add(images);
  48. }
  49. }
  50. /**
  51. * 客户端
  52. * 浅拷贝:副文档的字段引用了原始文档的字段; 其中任何一个的修改,都会对另一个产生影响;
  53. * 深拷贝:拷贝对象时,对于引用形的字段,也采用拷贝的形式 而不是单纯的引用
  54. * <p>
  55. * Created by Bill on 2017/12/20.
  56. */
  57. public class Client {
  58. public static void main(String[] args) {
  59. /* // 1、浅拷贝
  60. // 构建对象
  61. WordDocument originDocument = new WordDocument();
  62. originDocument.setText("这是一篇文档");
  63. originDocument.setImages("图片1");
  64. originDocument.setImages("图片2");
  65. originDocument.setImages("图片3");
  66. originDocument.showDocu();
  67. // 以原始文档为对象 拷贝一份
  68. WordDocument cloneDocument1 = originDocument.clone();
  69. originDocument.showDocu();
  70. // 修改备份文档 不会影响原始文档
  71. cloneDocument1.setText("这是修改过的文档2");
  72. //cloneDocument1.setImages("哈哈.jpg");
  73. cloneDocument1.showDocu();
  74. originDocument.showDocu();*/
  75. // 2.深拷贝 拷贝对象时,对于引用形的字段,也采用拷贝的形式 而不是单纯的引用
  76. WordDocument originDocument = new WordDocument();
  77. originDocument.setText("这是一篇文档");
  78. originDocument.setImages("图片1");
  79. originDocument.setImages("图片2");
  80. originDocument.setImages("图片3");
  81. originDocument.showDocu();
  82. // 以原始文档为对象 拷贝一份
  83. WordDocument cloneDocument1 = originDocument.clone();
  84. originDocument.showDocu();
  85. // 修改备份文档 不会影响原始文档
  86. cloneDocument1.setText("这是修改过的文档2");
  87. cloneDocument1.setImages("哈哈.jpg");
  88. cloneDocument1.showDocu();
  89. originDocument.showDocu();
  90. }
  91. }

四、工厂方法模式

  1. /**
  2. * 具体工厂类
  3. * <p>
  4. * 也可以给某个产品设置自己的工厂类 各司其职
  5. * Created by Bill on 2017/12/23.
  6. */
  7. public class ConcreateFactory extends Factory {
  8. /**
  9. * 静态方法
  10. *
  11. * @return
  12. */
  13. @Override
  14. public Product createProduct() {
  15. // return new ConcreteProductA();
  16. return new ConcreteProductB();
  17. }
  18. /**
  19. * 需要什么对爱那个 传入那个对象的类型即可
  20. *
  21. * @param tClass
  22. * @param <T>
  23. * @return
  24. */
  25. @Override
  26. public <T extends Product> T createProduct(Class<T> tClass) {
  27. Product p = null;
  28. try {
  29. p = (Product) Class.forName(tClass.getName()).newInstance();
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33. return (T) p;
  34. }
  35. }
  36. package com.zhao.bill.designmodel.factorymodel.one;
  37. /**
  38. * 具体的产品A
  39. * Created by Bill on 2017/12/23.
  40. */
  41. public class ConcreteProductA extends Product {
  42. @Override
  43. public void method() {
  44. System.out.println("我是具体的产品A");
  45. }
  46. }
  47. package com.zhao.bill.designmodel.factorymodel.one;
  48. /**
  49. * 抽象工厂类
  50. * Created by Bill on 2017/12/23.
  51. */
  52. public abstract class Factory {
  53. /**
  54. * 抽象工厂方法
  55. *
  56. * @return
  57. */
  58. public abstract <T extends Product> T createProduct(Class<T> tClass);
  59. public abstract Product createProduct();
  60. }
  61. package com.zhao.bill.designmodel.factorymodel.one;
  62. /**
  63. * 抽象产品类
  64. * Created by Bill on 2017/12/23.
  65. */
  66. public abstract class Product {
  67. /**
  68. * 抽象方法
  69. */
  70. public abstract void method();
  71. }

五、抽象工厂方法模式

  1. /**
  2. * 客户类
  3. * Created by Bill on 2018/1/12.
  4. */
  5. public class CarBuilderClient {
  6. public static void main(String[] args) {
  7. Q3Factory factory = new Q3Factory();
  8. factory.createBrake().brake();
  9. factory.createEngine().engine();
  10. factory.createTire().tire();
  11. System.out.println("=======================");
  12. Q7Factory q7Factory = new Q7Factory();
  13. q7Factory.createBrake().brake();
  14. q7Factory.createEngine().engine();
  15. q7Factory.createTire().tire();
  16. }
  17. }

六、观察者模式

  1. 1、编写观察者和被观测者抽象接口
  2. /**
  3. * desc: 观测者 抽象接口
  4. * author:Bill
  5. * date: 2018/1/31
  6. */
  7. public interface Observer {
  8. void update(int edition, float cost);
  9. }
  10. /**
  11. * desc:被观察者 抽象接口
  12. * author:Bill
  13. * date: 2018/1/31
  14. */
  15. public interface Observerable {
  16. // 注册
  17. void registerObserver(Observer o);
  18. // 解绑
  19. void removeObserver(Observer o);
  20. // 通知观测者
  21. void notifyObservers();
  22. }
  23. 2、实现被观察者接口
  24. /**
  25. * desc: 被观测者
  26. * author:Bill
  27. * date: 2018/1/31
  28. */
  29. public class MagazineData implements Observerable {
  30. private List<Observer> mObservers;
  31. private int edition;
  32. private float cost;
  33. public MagazineData() {
  34. mObservers = new ArrayList<>();
  35. }
  36. /**
  37. * 注册观察者
  38. *
  39. * @param o
  40. */
  41. @Override
  42. public void registerObserver(Observer o) {
  43. mObservers.add(o);
  44. }
  45. /**
  46. * 移除观察者
  47. *
  48. * @param o
  49. */
  50. @Override
  51. public void removeObserver(Observer o) {
  52. int i = mObservers.indexOf(o);
  53. if (i >= 0) {
  54. mObservers.remove(i);
  55. }
  56. }
  57. /**
  58. * 通知观察者
  59. */
  60. @Override
  61. public void notifyObservers() {
  62. // 遍历观察者 发送通知
  63. for (int i = 0; i < mObservers.size(); i++) {
  64. Observer observer = mObservers.get(i);
  65. observer.update(edition, cost);
  66. }
  67. }
  68. public void setInformation(int edition, float cost) {
  69. this.edition = edition;
  70. this.cost = cost;
  71. //信息更新完毕,通知所有观察者
  72. notifyObservers();
  73. }
  74. }
  75. 3、实现观察者接口
  76. /**
  77. * desc: 具体的观察者 实现观察者抽象接口Observer
  78. * author:Bill
  79. * date: 2018/1/31
  80. */
  81. public class Customer implements Observer {
  82. private String name;
  83. private int edition;
  84. private float cost;
  85. Customer(String name) {
  86. this.name = name;
  87. }
  88. @Override
  89. public void update(int edition, float cost) {
  90. this.edition = edition;
  91. this.cost = cost;
  92. buy();
  93. }
  94. private void buy() {
  95. System.out.println(name + "购买了第" + edition + "期的杂志,花费了" + cost + "元。");
  96. }
  97. }
  98. 4、编写测试类
  99. public class Test {
  100. public static void main(String[] args) {
  101. //创建被观察者
  102. MagazineData magazine = new MagazineData();
  103. //创建三个不同的观察者
  104. Observer customerA = new Customer("A");
  105. Observer customerB = new Customer("B");
  106. Observer customerC = new Customer("C");
  107. //将观察者注册到被观察者中
  108. magazine.registerObserver(customerA);
  109. magazine.registerObserver(customerB);
  110. magazine.registerObserver(customerC);
  111. //更新被观察者中的数据,当数据更新后,会自动通知所有已注册的观察者
  112. magazine.setInfomation(5, 12);
  113. }
  114. }