设计模式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 }
原文地址:https://www.cnblogs.com/asenyang/p/12111023.html