抽象工厂模式定义
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
这里新增一个概念,产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。一般是位于不同的等级结构中的相同位置上。显然,每一个产品族中含有产品的数目,与产品等级结构的数目是相等的,形成一个二维的坐标系,水平坐标是产品等级结构,纵坐标是产品族。叫做相图。
抽象工厂模式与工厂方法模式的区别
工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构,所以有个产品族的概念。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式中的所有产品都是来自同一个接口或抽象类,而抽象工厂模式中的产品则是来自不同的接口或抽象类。
抽象工厂模式是工厂方法模式的升级版本,在有多个业务,或者多个分类的情况下,抽象工厂模式比较适合。
前几天我写了工厂方法模式的文章,设计模式(2)-工厂方法模式详解(易懂)
文章里举例了手机工厂生产手机的例子,我们继续用这个例子来分析这两个模式。
首先来回忆一下工厂方法模式的例子:一个手机工厂生产华为和小米两种手机,模型图如下:
从模型上可以发现,两种手机在一个等级结构,也就是都实现或者集成了同一个接口或抽象类。
还以手机为例,现在加入了手机尺寸的要求,模型如下:
首先要知道一个概念,产品族,文章开头我已经定义了。
从上面模型可以发现:
6.0英寸华为手机A1与6.0英寸的小米手机B1属于一个产品族,5.5英寸华为手机A2与5.5英寸小米手机B2属于一个产品族;Factory1表示生产6.0英寸的手机,Factory2表示生产5.5英寸的手机。
抽象工厂模式中的抽象工厂类中的创建方法与产品族的个数有关。
有N个产品等级结构就会有N个实现工厂类。
抽象工厂模式代码演示
我们拿上面的抽象工厂实例模型举例:
1.首先看一下两种手机的抽象产品类:
public abstract class AbstractHUAWEI {
//华为手机共同的方法,比如品牌
public void commonMethod(){
}
//相同的方法,不同的实现。比如尺寸,型号等等
public abstract void dosomething();
}
public abstract class AbstractMI {
//小米手机共同的方法,比如品牌
public void commonMethod(){
}
//相同的方法,不同的实现。比如尺寸,型号等等
public abstract void dosomething();
}
2.两种手机对应的产品实现类
public class HUAWEI_A1 extends AbstractHUAWEI{
@Override
public void dosomething() {
Log.i("qzs","我是6.0英寸的华为手机A1");
}
}
public class HUAWEI_A2 extends AbstractHUAWEI {
@Override
public void dosomething() {
Log.i("qzs","我是5.5英寸的华为手机A2");
}
}
public class MI_B1 extends AbstractMI {
@Override
public void dosomething() {
Log.i("qzs","我是6.0英寸的小米手机B1");
}
}
public class MI_B2 extends AbstractMI {
@Override
public void dosomething() {
Log.i("qzs","我是5.5英寸的小米手机B1");
}
}
3.抽象工厂类
public abstract class AbstractFactory {
//6.0英寸手机
public abstract AbstractHUAWEI createSize1();
//5.5英寸手机
public abstract AbstractMI createSize2();
}
4.两个工厂实现类
public class Factory1 extends AbstractFactory {
@Override
public AbstractHUAWEI createSize1() {
return new HUAWEI_A1();
}
@Override
public AbstractMI createSize2() {
return new MI_B1();
}
}
public class Factory2 extends AbstractFactory {
@Override
public AbstractHUAWEI createSize1() {
return new HUAWEI_A2();
}
@Override
public AbstractMI createSize2() {
return new MI_B2();
}
}
5.调用
AbstractFactory factory1=new Factory1();
AbstractFactory factory2=new Factory2();
//生产A1
AbstractHUAWEI a1=factory1.createHUAWEI();
// a1.dosomething();
//生产A2
AbstractHUAWEI a2=factory2.createHUAWEI();
// a2.dosomething();
//生产B1
AbstractMI b1=factory1.createMI();
// b1.dosomething();
//生产B2
AbstractMI b2=factory2.createMI();
// b2.dosomething();
从调用类可以看出,创建的生产对象过程与实现类无关。
抽象工厂模式的优缺点
1.优点
-
隔离了具体类(从调用类的代码可以看出),非公开。
-
增加产品下的系列也就是增加具体的实现工厂类很方便,符合“开闭原则”(比如上面的例子中我在两种手机下又新增了一个5.0英寸的,直接加一个新的具体工厂类就可以了)
2.缺点
-
抽象工厂模式的产品族扩展是很难的,拿上面的手机举例,如果我增加个一个手机品牌OPPO,那么由两个品牌变成三个品牌,试试改一下会发现:首先要更改抽象工厂类,然后会发现所有的类基本上都跟着动了。改变了抽象类和接口,这是大忌!
-
类文件增加过快
参考资料《大话设计模式》《设计模式之禅》
我建立一个Android新人QQ交流群,群号:458739310
微信群可以直接加我的微信 微信号:lengquele5311,或者直接看公号。
推荐阅读
相关推荐
第二本"23种java设计模式.pdf"直接点明了主题,这23种模式是根据GOF(GoF,Gang of Four)的经典著作《设计模式:可复用面向对象软件的基础》中的分类,包括创建型模式(如工厂模式、抽象工厂模式、单例模式等)、...
### 23种设计模式(通俗易懂篇) #### 创建型模式 1. **Factory(工厂模式)** - **应用场景**:当你需要为用户提供多种选择时,例如选择不同的餐厅来满足不同用户对食物的偏好。 - **原理**:在工厂模式中,...
《Java与模式-清晰书签版》是一份包含多种Java设计模式详解的资源包,旨在帮助开发者深入理解和应用设计模式。这份资源集成了多种格式的文档,包括详细的文本描述、图表解析以及实际代码示例,使得学习过程更加直观...
在本书中,"HEAD_FIRST设计模式(中文版)"采用了易懂且生动的方式,将复杂的概念以图文并茂的形式呈现,使得读者能够更轻松地理解和掌握设计模式。以下是对几个关键设计模式的详解: 1. **工厂模式**:它是创建型...
- **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 - **单例模式**:确保一个类仅有一个实例,并提供一个访问它的全局访问点。 - **建造者模式**:将一个复杂对象的构建与...
### 23种设计模式详解 #### 一、Abstract Factory(抽象工厂模式) **定义**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 **应用场景**:当系统需要创建一组相关的产品对象时,使用...
:hot_beverage: 用Java实现的设计模式〜 ... :check_mark:抽象工厂模式( Abstract Factroy Pattern ) :memo: , :check_mark:建造者模式( Builder Pattern ) :memo: , :check_mark:单例模式( S
1、Abstract Factory 抽象工厂 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 2、Builder 生成器 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 3、...
- **创建型模式**:关注的是对象的创建方式,包括单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、构建者模式(Builder)和原型模式(Prototype)等。 - **结构型模式**...
3. **程序逻辑与设计模式**:介绍如何利用设计模式简化程序逻辑,提高代码的可维护性和扩展性。 4. **美术设计的重要性**:探讨美观的用户界面对用户体验的影响。 5. **具体实例分析**:通过一个简单的网页游戏案例...
- **工厂模式**:简单工厂、工厂方法和抽象工厂,以及在Spring框架中的应用。 - **装饰器模式**:用于动态地给一个对象添加一些额外的职责,如Servlet过滤器。 6. **JVM** - **类加载机制**:了解双亲委派模型,...
### 2024 Java面试题详解 #### 一、Java基础知识 ...以上内容覆盖了2024年Java面试中可能出现的基础知识、面向对象编程、集合框架、多线程与并发编程、JVM与性能优化、设计模式以及Spring框架等多个方面的知识点。
- **设计模式**:介绍了一些经典的设计模式,如单例模式、工厂模式等,帮助读者解决特定的设计问题。 #### 四、结论 《C++编程思想》是一本值得所有C++学习者和开发者拥有的书籍。它不仅包含了丰富的技术内容,更...
7. **设计模式** - 观察者模式:用于游戏状态的更新,例如,当蛇吃到食物时,观察者(如分数显示)会自动收到通知并更新界面。 - 工厂模式:可能用于创建不同类型的蛇段或食物对象。 8. **优化与性能** - 适当的...
本书中介绍了一些常见的设计模式,如单例模式、工厂模式等,帮助读者更好地理解和应用面向对象编程思想。 **3.3 Java中的接口与抽象类** - **接口:** 定义了一组行为规范,任何实现了该接口的类必须实现接口中...