设计模式(三)-抽象工厂模式
1、定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无法指定它们具体的类。
2、适用场景:
- 客户端(应用层)不依赖于产品类实例如何被创建;
- 强调一个系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码;
- 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现。
3、优点:
- 具体产品在应用层的代码隔离,无需关心创建的细节;
- 将一个系列的产品统一到一起创建。
4、缺点:
- 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难;
- 增加了系统的抽象性和理解难度。
5、类图:
6、代码例子
1 /** 2 * 手机产品接口 3 */ 4 public interface IphoneProduct { 5 6 void start(); 7 void shutdown(); 8 void callup(); 9 void sendSMS(); 10 }
1 /** 2 * 华为手机 3 */ 4 public class HuaweiPhone implements IphoneProduct { 5 @Override 6 public void start() { 7 System.out.println("开启华为手机"); 8 } 9 10 @Override 11 public void shutdown() { 12 System.out.println("关闭华为手机"); 13 } 14 15 @Override 16 public void callup() { 17 System.out.println("华为打电话"); 18 } 19 20 @Override 21 public void sendSMS() { 22 System.out.println("华为发短信"); 23 } 24 }
1 /** 2 * 小米手机 3 */ 4 public class XiaomiPhone implements IphoneProduct { 5 @Override 6 public void start() { 7 System.out.println("开启小米手机"); 8 } 9 10 @Override 11 public void shutdown() { 12 System.out.println("关闭小米手机"); 13 } 14 15 @Override 16 public void callup() { 17 System.out.println("小米打电话"); 18 } 19 20 @Override 21 public void sendSMS() { 22 System.out.println("小米发短信"); 23 } 24 }
1 /** 2 * 路由器产品接口 3 */ 4 public interface IRouterProduct { 5 6 void start(); 7 void shutdown(); 8 void openWife(); 9 void setting(); 10 }
1 /** 2 * 华为路由器 3 */ 4 public class HuaweiRouter implements IRouterProduct { 5 @Override 6 public void start() { 7 System.out.println("启动华为路由器"); 8 } 9 10 @Override 11 public void shutdown() { 12 System.out.println("关闭华为路由器"); 13 } 14 15 @Override 16 public void openWife() { 17 System.out.println("开启华为wife"); 18 } 19 20 @Override 21 public void setting() { 22 System.out.println("设置华为路由器"); 23 } 24 }
1 /** 2 * 小米路由器 3 */ 4 public class XiaomiRouter implements IRouterProduct { 5 @Override 6 public void start() { 7 System.out.println("启动小米路由器"); 8 } 9 10 @Override 11 public void shutdown() { 12 System.out.println("关闭小米路由器"); 13 } 14 15 @Override 16 public void openWife() { 17 System.out.println("开启小米wife"); 18 } 19 20 @Override 21 public void setting() { 22 System.out.println("设置小米路由器"); 23 } 24 }
1 /** 2 * 抽象产品工厂 3 */ 4 public interface IProductFactory { 5 //生产手机 6 IphoneProduct iphoneProduct(); 7 8 //生产路由器 9 IRouterProduct routerProduct(); 10 11 12 }
1 /** 2 * 华为工厂 3 */ 4 public class HuaweiFactory implements IProductFactory { 5 @Override 6 public IphoneProduct iphoneProduct() { 7 return new HuaweiPhone(); 8 } 9 10 @Override 11 public IRouterProduct routerProduct() { 12 return new HuaweiRouter(); 13 } 14 }
1 /** 2 * 华为工厂 3 */ 4 public class XiaomiFactory implements IProductFactory { 5 @Override 6 public IphoneProduct iphoneProduct() { 7 return new XiaomiPhone(); 8 } 9 10 @Override 11 public IRouterProduct routerProduct() { 12 return new XiaomiRouter(); 13 } 14 }
测试类如下:
1 public class Client { 2 public static void main(String[] args) { 3 System.out.println("============小米系列产品===================="); 4 //小米工厂 5 XiaomiFactory xiaomiFactory = new XiaomiFactory(); 6 IphoneProduct xiaomiPhone = xiaomiFactory.iphoneProduct(); 7 xiaomiPhone.start(); 8 xiaomiPhone.shutdown(); 9 xiaomiPhone.callup(); 10 xiaomiPhone.sendSMS(); 11 12 IRouterProduct xiaomiRouter = xiaomiFactory.routerProduct(); 13 xiaomiRouter.start(); 14 xiaomiRouter.setting(); 15 xiaomiRouter.openWife(); 16 xiaomiRouter.setting(); 17 18 System.out.println("============华为系列产品===================="); 19 //华为工厂 20 HuaweiFactory huaweiFactory = new HuaweiFactory(); 21 IphoneProduct huaweiPhone = huaweiFactory.iphoneProduct(); 22 huaweiPhone.start(); 23 huaweiPhone.shutdown(); 24 huaweiPhone.callup(); 25 huaweiPhone.sendSMS(); 26 27 IRouterProduct huaweiRouter = huaweiFactory.routerProduct(); 28 huaweiRouter.start(); 29 huaweiRouter.setting(); 30 huaweiRouter.openWife(); 31 huaweiRouter.setting(); 32 33 } 34 }
7、小结
- 简单工厂模式(静态工厂模式):虽然某种程度上不符合设计原则,但是实际使用最多;
- 工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展;
- 抽象工厂模式:不可以增加产品,可以增加产品族。
8、应用场景
- JDK中Calendar的getInstance方法;
- 反射中Class对象的newInstance方法;
- JDBC中的Connection对象的获取;
- Spring中IOC容器创建管理bean对象。
如本文有侵权行为,请及时与本人联系,多多包涵!
小生初出茅庐,多多指教!
本文来自博客园,作者:it-小林,转载请注明原文链接:https://www.cnblogs.com/linruitao/p/14978758.html