1. 什么是抽象工厂模式
- 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们的类
- 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列
2. 抽象工厂模式的优点/缺点及适用场景
2.1 抽象工厂模式的优点
- 具体产品在应用层的代码隔离,无需关心创建的细节
- 将一个系列的产品统一到一起创建
2.2 抽象工厂模式的缺点
- 具体产品在应用层的代码隔离,无需关系创建的细节
- 将一个系列的产品统一到一起创建
2.3 抽象工厂模式的适用场景
- 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
- 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
- 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

3.抽象工厂模式简单案例
3.1 创建抽象工厂
package com.san.factroy.abst;
import com.san.factroy.fac.Computer;
import com.san.factroy.fac.Mobile;
public abstract class AbstFactory {
public abstract Mobile genMobile();
public abstract Computer genComputer();
}
3.2 创建苹果工厂
package com.san.factroy.apple;
import com.san.factroy.abst.AbstFactory;
import com.san.factroy.fac.Computer;
import com.san.factroy.fac.Mobile;
public class IphoneFactory extends AbstFactory {
@Override
public Mobile genMobile() {
return new Iphone();
}
@Override
public Computer genComputer() {
return new MacBook();
}
}
3.3 创建小米工厂
package com.san.factroy.mi;
import com.san.factroy.abst.AbstFactory;
import com.san.factroy.fac.Computer;
import com.san.factroy.fac.Mobile;
public class MiFactory extends AbstFactory {
@Override
public Mobile genMobile() {
return new MiMobile();
}
@Override
public Computer genComputer() {
return new MiComputer();
}
}
3.4 创建手机产品
package com.san.factroy.fac;
public interface Mobile {
void dialNumber();
void sendMsg();
}
3.5 创建电脑产品
package com.san.factroy.fac;
public interface Computer {
void playGames();
void writeJava();
}
3.6 小米手机和小米电脑
package com.san.factroy.mi;
import com.san.factroy.fac.Mobile;
public class MiMobile implements Mobile {
@Override
public void dialNumber() {
System.out.println("MI 拨打电话");
}
@Override
public void sendMsg() {
System.out.println("MI 发送短信");
}
}
package com.san.factroy.mi;
import com.san.factroy.fac.Computer;
public class MiComputer implements Computer {
@Override
public void playGames() {
System.out.println("Mi电脑 打游戏");
}
@Override
public void writeJava() {
System.out.println("Mi电脑 编写Java程序");
}
}
3.7 苹果手机和苹果电脑
package com.san.factroy.apple;
import com.san.factroy.fac.Mobile;
public class Iphone implements Mobile {
@Override
public void dialNumber() {
System.out.println("苹果 拨打电话");
}
@Override
public void sendMsg() {
System.out.println("苹果 发送短信");
}
}
package com.san.factroy.apple;
import com.san.factroy.fac.Computer;
public class MacBook implements Computer {
@Override
public void playGames() {
System.out.println("MacBook 打游戏");
}
@Override
public void writeJava() {
System.out.println("MacBook 编写Java程序");
}
}
3.8 具体使用
package com.san.factroy;
import com.san.factroy.abst.AbstFactory;
import com.san.factroy.apple.IphoneFactory;
import com.san.factroy.fac.Computer;
import com.san.factroy.fac.Mobile;
import com.san.factroy.mi.MiFactory;
public class Client {
public static void main(String[] args) {
AbstFactory iphoneFac = new IphoneFactory();
AbstFactory miFac = new MiFactory();
Computer macBook = iphoneFac.genComputer();
Computer miComputer = miFac.genComputer();
Mobile miMobile = miFac.genMobile();
Mobile iphone = iphoneFac.genMobile();
macBook.playGames();
miComputer.playGames();
miMobile.dialNumber();
iphone.dialNumber();
}
}
4.抽象工厂模式在Java中的应用
- 在 Spring 中,BeanFactory 是用于管理 Bean 的一个工厂,所有工厂都是 BeanFactory 的子类。这样我们可以通过 IOC 容器来管理访问 Bean,根据不同的策略调用 getBean() 方法,从而获得具体对象。
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
