工厂方法模式(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 }