java设计模式-抽象工厂模式
模式导读:
所谓抽象工厂模式就是它提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类,允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。这样一来,客户就可以从具体的产品中被解耦。它的优点是隔离了具体类的生成,使得客户端不需要知道什么被创建了,而缺点就在于新增新的行为会比较麻烦,因为当添加一个新的产品对象时,需要更改接口及其下所有子类。
介绍(参考菜鸟教程)
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OO 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
注意事项:产品族难扩展,产品等级易扩展。
如何实现
参考类图
代码实现
1.定义一个接口用于实现获取工厂内产品的方法
1 package com.etc; 2 3 public interface AbstractFactory { 4 //定义一个接口用于实现获取工厂内产品的方法 5 public Computer getComputer(); 6 public Phone getPhone(); 7 }
2.定义具体的工厂类实现抽象工厂内获取具体产品的方法
(1)ComputerFactory.java
1 package com.etc; 2 3 //定义具体的工厂类实现抽象工厂内获取具体产品的方法 4 public class ComputerFactory implements AbstractFactory{ 5 public Computer getComputer() { 6 return new LenveoComputer(); 7 } 8 9 @Override 10 public Phone getPhone() { 11 12 return null; 13 } 14 }
(2)PhoneFactory.java
1 package com.etc; 2 3 //定义具体的工厂类实现抽象工厂内获取具体产品的方法 4 public class PhoneFactory implements AbstractFactory{ 5 public Phone getPhone() { 6 return new ApplePhone(); 7 } 8 9 @Override 10 public Computer getComputer() { 11 12 return null; 13 } 14 }
3.定义具体的抽象产品类,里面定义获取具体产品信息的方法
(1)Computer.java
1 package com.etc; 2 3 public interface Computer { 4 //定义一个接口实现产品电脑信息的打印 5 public void print(); 6 7 }
(2)Phone.java
1 package com.etc; 2 3 public interface Phone { 4 //定义一个接口实现产品手机信息的打印 5 public void fill(); 6 }
4.定义具体的产品实现类,里面实现打印出产品的信息的方法
(1)LenveoComputer.java
1 package com.etc; 2 3 public class LenveoComputer implements Computer { 4 5 @Override 6 public void print() { 7 System.out.println("这是一台联想电脑!"); 8 9 } 10 11 }
(2)ApplePhone.java
1 package com.etc; 2 3 public class ApplePhone implements Phone { 4 //工厂内具体产品苹果手机打印 5 @Override 6 public void fill() { 7 System.out.println("这是一部苹果手机!"); 8 } 9 10 }
5.定义一个类用于实现根据用户具体需求获取哪一个工厂以及相关的产品
1 package com.etc; 2 3 public class AbstractProducer { 4 //定义一个方法用于获取想要的具体的工厂 5 public AbstractFactory getFactory(int fid) { 6 //根据客户需求判断具体需要哪个工厂 7 switch(fid) { 8 case 1:{ 9 return new ComputerFactory(); 10 } 11 case 2: 12 return new PhoneFactory(); 13 } 14 return null; 15 } 16 }
6.定义一个测试类
1 package com.etc; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 AbstractProducer ap=new AbstractProducer(); 7 //获取具体工厂然后获取具体产品最后打印出来 8 ap.getFactory(1).getComputer().print(); 9 ap.getFactory(2).getPhone().fill(); 10 11 } 12 13 }
效果截图
