抽象工厂模式的定义:
抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。
案例走起:在代码中理解设计模式学的思想:
本案例大纲
Java的案例大纲
package coms.Design.Mode.abstact1; /** * 抽象产品工厂 * 总工厂 * 生产手机 * 定义生产产品的类型 */ public interface IProductFactory { //生产手机产品 IphoneProduct phoneProduct(); //生产路由器产品 IRouterProduct routerProduct(); }
上面的 IProductFactory 是项目的总工厂 来设计产品的类型
package coms.Design.Mode.abstact1; //手机产品接口 public interface IphoneProduct { void start(); void shutdown(); void callup(); void sendSms(); void reading(); }
package coms.Design.Mode.abstact1; //路由器产品接口 public interface IRouterProduct { void start(); void shutdown(); void openwife(); void seting(); void X(); }
IRouterProduct 这是从总工厂中分离出来的一种产品为路由器
IphoneProduct 这是从总工厂中分离出来的一种产品为手机
先看华为工厂的代码:
package coms.Design.Mode.abstact1; /** * 华为工厂 */ public class HuWeiFactory implements IProductFactory{ //手机系列 @Override public IphoneProduct phoneProduct() { return new HuWeiPhone(); } //路由器系列 @Override public IRouterProduct routerProduct() { return new HuWeiRouter(); } }
package coms.Design.Mode.abstact1; /** * 华为手机 */ public class HuWeiPhone implements IphoneProduct{ @Override public void start() { System.out.println("开启华为手机"); } @Override public void shutdown() { System.out.println("关闭华为手机"); } @Override public void callup() { System.out.println("开启华为手机打电话"); } @Override public void sendSms() { System.out.println("开启华为手机发信息"); } @Override public void reading() { System.out.println("开启华为手机阅读数据"); } }
package coms.Design.Mode.abstact1; /** * 小米路由器 */ public class HuWeiRouter implements IRouterProduct{ @Override public void start() { System.out.println("开启华为路由器"); } @Override public void shutdown() { System.out.println("关闭华为路由器"); } @Override public void openwife() { System.out.println("华为打开WiFi"); } @Override public void seting() { System.out.println("华为设置参数"); } @Override public void X() { System.out.println("华为未知参数X"); } }
在看小米系列
package coms.Design.Mode.abstact1; public class XiaomiFactory implements IProductFactory{ @Override public IphoneProduct phoneProduct() { //创造小米手机 return new XiaomiPhone(); } @Override public IRouterProduct routerProduct() { //创造小米路由器 return new XiaomiRouter(); } }
package coms.Design.Mode.abstact1; /** * 小米手机 */ public class XiaomiPhone implements IphoneProduct{ @Override public void start() { System.out.println("开启小米手机"); } @Override public void shutdown() { System.out.println("关闭小米手机"); } @Override public void callup() { System.out.println("开启小米手机打电话"); } @Override public void sendSms() { System.out.println("开启小米手机发信息"); } @Override public void reading() { System.out.println("开启小米手机阅读数据"); } }
package coms.Design.Mode.abstact1; import java.security.spec.RSAOtherPrimeInfo; /** * 小米路由器 */ public class XiaomiRouter implements IRouterProduct{ @Override public void start() { System.out.println("开启路由器"); } @Override public void shutdown() { System.out.println("关闭路由器"); } @Override public void openwife() { System.out.println("小米打开WiFi"); } @Override public void seting() { System.out.println("小米设置参数"); } @Override public void X() { System.out.println("小米未知参数X"); } }
在看测试类
package coms.Design.Mode.abstact1; /** * 测试类 */ public class ClientTest { public static void main(String[] args) { System.out.println("========================小米产品======================="); XiaomiFactory xiaomiFactory = new XiaomiFactory(); IphoneProduct iphoneProduct = xiaomiFactory.phoneProduct(); iphoneProduct.reading(); iphoneProduct.shutdown(); System.out.println("==================小米路由器================="); IRouterProduct iRouterProduct = xiaomiFactory.routerProduct(); iRouterProduct.openwife(); iRouterProduct.start(); iRouterProduct.X(); System.out.println("========================华为系列产品======================="); HuWeiFactory huWeiFactory = new HuWeiFactory(); IphoneProduct iphoneProduct1 = huWeiFactory.phoneProduct(); iphoneProduct1.reading(); iphoneProduct1.shutdown(); System.out.println("==================华为路由器================="); IRouterProduct iRouterProduct1 = huWeiFactory.routerProduct(); iRouterProduct1.openwife(); iRouterProduct1.start(); iRouterProduct1.X(); } }
代码解读
第一步 创建小米工厂
XiaomiFactory xiaomiFactory = new XiaomiFactory();
第二步:在小米工厂调用phoneProduct()
IphoneProduct iphoneProduct = xiaomiFactory.phoneProduct();
第三步 iphoneProduct.动作名
iphoneProduct.reading();
理清楚下面的关系:
1 在HuWeiFactory和XiaomiFactory 两个工厂中。
public class HuWeiFactory implements IProductFactory{ public class XiaomiFactory implements IProductFactory{
2 在HuWeiPhone和HuWeiRouter 的两个实现类中分别实现的是 产品和路由器。
public class HuWeiPhone implements IphoneProduct{
public class HuWeiRouter implements IRouterProduct{
3 同理 在XiaomiPhone和XiaomiRouter 的两个实现类中分别实现的是 产品和路由器。
关系理清楚了自己去画流程图吧!
工厂模式
◆小结:
◆简单工厂模式(静态工厂模式)
◆虽然某种程度 上不符合设计原则,但实际使用最多!◆工厂方法模式I
◆不修改已有类的前提下,通过增加新的工厂类实现扩展。◆抽象工厂模式
◆不可以增加产品,可以增加产品族!
◆应用场景:
◆JDK中Calendar的getInstance方法◆JDBC中的Connection对象的获取Spring中IOC容器创建管理bean对象◆反射中Class对象的newInstance方法