• 设计模式03 工厂方法模式


    工厂方法模式(FactoryMethod)定义:定义一个用于创建对象(产品对象)的接口,称之为工厂,由实现了这个工厂接口的具体类来创建对象(产品对象)。

    工厂方法模式的优点是:可以方便的添加新的产品对象,而不用修改原来的代码,满足开闭原则

    如UML类图所示,目前有ProductA和ProductB两个产品对象需要创建,系统可能会在今后再增加一个ProductC。这种情况就适合使用工厂方法模式。

    工厂接口与工厂实现类:

     1 public interface Factory {
     2 
     3     Product createProduct();
     4 }
     5 
     6 public class FactoryA implements Factory {
     7     @Override
     8     public Product createProduct() {
     9         // TODO Auto-generated method stub
    10         return new ProductA();
    11     }
    12 }
    13 
    14 public class FactoryB implements Factory {
    15     @Override
    16     public Product createProduct() {
    17         // TODO Auto-generated method stub
    18         //创建这个对象的方法的改变,不影响对这个对象的调用
    19         return new ProductB();
    20     }
    21 }

    产品抽象类与具体产品:

     1 public interface Product {
     2     void generateProduct();
     3 }
     4 
     5 public class ProductA implements Product {
     6 
     7     public String ProductName;
     8 
     9     public int Amount;
    10 
    11     public String getProductName() {
    12         return ProductName;
    13     }
    14 
    15     public void setProductName(String productName) {
    16         ProductName = productName;
    17     }
    18 
    19     public int getAmount() {
    20         return Amount;
    21     }
    22 
    23     public void setAmount(int amount) {
    24         Amount = amount;
    25     }
    26 
    27     @Override
    28     public String toString() {
    29         return "ProductA [ProductName=" + ProductName + ", Amount=" + Amount + "]";
    30     }
    31 
    32     @Override
    33     public void generateProduct() {
    34         // TODO Auto-generated method stub
    35         this.setProductName("辽宁舰");
    36         this.setAmount(150);
    37         System.out.println(this);
    38     }
    39 }
    40 
    41 public class ProductB implements Product {
    42 
    43     public String ProductName;
    44     public int Amount;
    45     public String DateTime;
    46 
    47     public ProductB() {
    48 
    49     }
    50 
    51     public ProductB(String name, int amount, String dt) {
    52         this.setProductName(name);
    53         this.setAmount(amount);
    54         this.setDateTime(dt);
    55     }
    56 
    57     public String getProductName() {
    58         return ProductName;
    59     }
    60 
    61     public void setProductName(String productName) {
    62         ProductName = productName;
    63     }
    64 
    65     public int getAmount() {
    66         return Amount;
    67     }
    68 
    69     public void setAmount(int amount) {
    70         Amount = amount;
    71     }
    72 
    73     public String getDateTime() {
    74         return DateTime;
    75     }
    76 
    77     public void setDateTime(String dateTime) {
    78         DateTime = dateTime;
    79     }
    80 
    81     @Override
    82     public String toString() {
    83         return "ProductB [ProductName=" + ProductName + ", Amount=" + Amount + ", DateTime=" + DateTime + "]";
    84     }
    85 
    86     @Override
    87     public void generateProduct() {
    88         // TODO Auto-generated method stub
    89         System.out.println(this);
    90     }
    91 }

    调用方式:

     1 public class Client {
     2 
     3     public static void main(String[] args) {
     4         // 扩展点
     5         Factory factory;
     6 
     7         // 扩展点
     8         factory = new FactoryA();
     9         // 切换到B工厂
    10         // factory = new FactoryB();
    11 
    12         // 创建模式,最终得到的对象
    13         Product product = factory.createProduct();
    14         product.generateProduct();
    15 
    16         //使用静态工厂方法
    17         staticFactory(2);
    18     }
    19 
    20     //静态工厂
    21     public static void staticFactory(int type) {
    22         Product product;
    23         if (type == 1) {
    24             product = new ProductA();
    25 
    26         } else {
    27             product = new ProductB("山东舰", 500, "2019-12-17");
    28         }
    29         // 增加productC,需要修改当前方法
    30         product.generateProduct();
    31     }
    32 }
  • 相关阅读:
    刷题-力扣-剑指 Offer 22. 链表中倒数第k个节点
    刷题-力扣-617. 合并二叉树
    刷题-力扣-1109. 航班预订统计
    刷题-力扣-606. 根据二叉树创建字符串
    刷题-力扣-563. 二叉树的坡度
    扛把子组20191017-8 alpha week 2/2 Scrum立会报告+燃尽图 07
    20191017-7 alpha week 2/2 Scrum立会报告+燃尽图 06
    20191017-6alpha week 2/2 Scrum立会报告+燃尽图 05
    扛把子组20191017-5 alpha week 2/2 Scrum立会报告+燃尽图 04
    记第一次 团建
  • 原文地址:https://www.cnblogs.com/asenyang/p/12111023.html
Copyright © 2020-2023  润新知