5 Singleton模式——只有一个实例

6 Prototype模式——通过复制生成实例

6.2 示例程序

image.png

包framework

  1. public interface Product extends Cloneable {
  2. void use(String s);
  3. Product createClone();
  4. }
  5. public class Manager {
  6. private HashMap showcase = new HashMap();
  7. public void register(String name, Product proto) {
  8. showcase.put(name, proto);
  9. }
  10. public Product create(String protoname) {
  11. Product p = (Product)showcase.get(protoname);
  12. return p.createClone();
  13. }
  14. }

product

  1. public class MessageBox implements Product {
  2. private char decochar;
  3. public MessageBox(char decochar) {
  4. this.decochar = decochar;
  5. }
  6. @Override
  7. public void use(String s) {
  8. int length = s.getBytes().length;
  9. for (int i = 0; i < length + 4; i++) {
  10. System.out.print(decochar);
  11. }
  12. System.out.println("");
  13. System.out.println(decochar + " " + s + " " + decochar);
  14. for (int i = 0; i < length + 4; i++) {
  15. System.out.print(decochar);
  16. }
  17. System.out.println("");
  18. }
  19. @Override
  20. public Product createClone() {
  21. Product p = null;
  22. try {
  23. p = (Product)clone();
  24. } catch (CloneNotSupportedException e) {
  25. e.printStackTrace();
  26. }
  27. return p;
  28. }
  29. }
  30. public class UnderlinePen implements Product {
  31. private char ulchar;
  32. public UnderlinePen(char ulchar) {
  33. this.ulchar = ulchar;
  34. }
  35. @Override
  36. public void use(String s) {
  37. int length = s.getBytes().length;
  38. System.out.println("\"" + s + "\"");
  39. System.out.print(" ");
  40. for (int i = 0; i < length; i++) {
  41. System.out.print(ulchar);
  42. }
  43. System.out.println("");
  44. }
  45. @Override
  46. public Product createClone() {
  47. Product p = null;
  48. try {
  49. p = (Product)clone();
  50. } catch (CloneNotSupportedException e) {
  51. e.printStackTrace();
  52. }
  53. return p;
  54. }
  55. }

使用

  1. public class Main {
  2. public static void main(String[] args) {
  3. // 准备
  4. Manager manager = new Manager();
  5. UnderlinePen upen = new UnderlinePen('~');
  6. MessageBox mbox = new MessageBox('*');
  7. MessageBox sbox = new MessageBox('/');
  8. manager.register("strong message", upen);
  9. manager.register("warning box", mbox);
  10. manager.register("slash box", sbox);
  11. // 生成
  12. Product p1 = manager.create("strong message");
  13. p1.use("Hello, world.");
  14. Product p2 = manager.create("warning box");
  15. p2.use("Hello, world.");
  16. Product p3 = manager.create("slash box");
  17. p3.use("Hello, world.");
  18. }
  19. }

6.3 Protptype模式中的角色

image.png

7 Builder模式——组装复杂的实例

8 AbstractFactory模式——抽象工厂