Java 抽象工厂模式
抽象工厂
定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类。
为了能更好理解抽象工厂模式,举个例子:
手机有小米手机、华为手机、苹果手机....,这些具体的手机和抽象手机就构成了一个产品等级结构。
同样的,路由器有小米路由器,华为路由器,这些具体的路由器和抽象路由器就构成了另一个产品等级结构,实质
上产品等级结构即产品的继承结构(相当于实现了同一个接口的实现类)。小米手机位于手机产品等级结构中,小米路由器位于路由器的产品等级结构中
,而小米手机和小米路由器都是小米公司生产的,这样就构成了一个产品族,同理华为手机和华为路由器也构成了一个产品族。
重点:产品族中的产品都是由同一个工厂生产的,位于不同的产品等级结构。
抽象工厂是针对产品族。
优点:
1、无需关心创建的细节
2、将一个系列的产品统一到一起创建
示例:
定义手机产品接口
public interface Phone {//定义手机产品接口 void start();//开机 void close();//关机 void sendOut();//发送信息 }
定义路由器产品接口
public interface Router {//定义路由器产品的接口 void start();//开机 void close();//关机 void wifi();//开启wifi }
定义小米手机和小米路由器的产品实现类。
public class XiaomiPhone implements Phone {// 手机产品接口的实现类 小米手机 @Override public void start() { System.out.println("开启小米手机"); } @Override public void close() { System.out.println("关闭小米手机"); } @Override public void sendOut() { System.out.println("使用小米手机发短信"); } }
public class XiaomiRouter implements Router {// 路由器产品接口的实现类 小米路由器 @Override public void start() { System.out.println("开启小米路由器"); } @Override public void close() { System.out.println("开闭小米路由器"); } @Override public void wifi() { System.out.println("打开小米路由器的wifi功能"); } }
定义华为手机和华为路由器的产品实现类。
public class HuaweiPhone implements Phone {// 手机产品接口的实现类 华为手机 @Override public void start() { System.out.println("开启华为手机"); } @Override public void close() { System.out.println("关闭华为手机"); } @Override public void sendOut() { System.out.println("使用华为手机发短信"); } }
public class HuaweiRouter implements Router { // 路由产品接口的实现类 华为路由器 @Override public void start() { System.out.println("开启华为路由器"); } @Override public void close() { System.out.println("开闭华为路由器"); } @Override public void wifi() { System.out.println("打开华为路由器的wifi功能"); } }
定义一个抽象工厂接口。(抽象产品族工厂)
public interface ProductFactory {//抽象产品工厂接口 /** * 生产手机 * */ Phone productPhone(); /** * 生产路由器 * */ Router productRouter(); }
小米工厂和华为工厂实现类
public class XiaomiFactory implements ProductFactory {// 抽象工厂接口的实现类 --> 小米工厂类 @Override public Phone productPhone() { System.out.println("-----------------------生产小米手机-----------------------"); return new XiaomiPhone(); } @Override public Router productRouter() { System.out.println("-----------------------生产小米路由器-----------------------"); return new XiaomiRouter(); } }
public class HuaweiFactory implements ProductFactory {// 抽象工厂接口的实现类 --> 华为工厂类 @Override public Phone productPhone() { System.out.println("-----------------------生产华为手机-----------------------"); return new HuaweiPhone(); } @Override public Router productRouter() { System.out.println("-----------------------生产华为路由器-----------------------"); return new HuaweiRouter(); } }
客户端:
public class Test { public static void main(String[] args) { System.out.println("=========================小米系列产品========================="); //小米工厂实例 ProductFactory xiaofactory = new XiaomiFactory(); //小米手机 Phone xiaoPhone = xiaofactory.productPhone(); xiaoPhone.start(); xiaoPhone.sendOut(); xiaoPhone.close(); //小米路由器 Router xiaoRouter = xiaofactory.productRouter(); xiaoRouter.start(); xiaoRouter.wifi(); xiaoRouter.close(); System.out.println(); System.out.println(); System.out.println(); System.out.println("=========================华为系列产品========================="); //华为工厂实例 ProductFactory huaweifactory = new HuaweiFactory(); //华为手机 Phone huaweiPhone = huaweifactory.productPhone(); huaweiPhone.start(); huaweiPhone.sendOut(); huaweiPhone.close(); //华为路由器 Router huaweiRouter= huaweifactory.productRouter(); huaweiRouter.start(); huaweiRouter.wifi(); huaweiRouter.close(); } }
结果:
1 =========================小米系列产品========================= 2 -----------------------生产小米手机----------------------- 3 开启小米手机 4 使用小米手机发短信 5 关闭小米手机 6 -----------------------生产小米路由器----------------------- 7 开启小米路由器 8 打开小米路由器的wifi功能 9 开闭小米路由器 10 11 12 13 =========================华为系列产品========================= 14 -----------------------生产华为手机----------------------- 15 开启华为手机 16 使用华为手机发短信 17 关闭华为手机 18 -----------------------生产华为路由器----------------------- 19 开启华为路由器 20 打开华为路由器的wifi功能 21 开闭华为路由器
抽象工厂模式的缺点:
1、规定了所有可能被创建的产品集合,产品族中扩展新的产品困难
2、增加了系统的抽象性和理解难度