模式意图

  提供对象的使用接口,隐藏对象的创建过程。

模式结构

AbstractFactory 提供创建对象的接口。

ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。

AbstractProduct 提供对象的使用接口。

ConcreteProduct 提供真正的适用对象,隐藏该对象的创建过程,是工厂创建的对象。

Client 使用者,通过抽象工厂接口,使用不同的具体工厂方法创建对象组合,从而直接使用对象,无需关注对象的创建过程。

适合场景

  1 系统独立于它的产品创建、组合和表示。即无需关心内部对象时如何创建的,怎么创建的,什么含义。

  2 系统需要多个产品组合中的一个配置。由于对象很多,能够组合出的组合非常多,而系统只是使用某一个组合。

  3 强调的对象的组合结果,而不是他们具体的接口和实现。

代码结构

  AbstractFactory.java

interface AbstractFactory {
public AbstractProductA CreateProductA();
public AbstractProductB CreateProductB();
}

  ConcreteFactory.java

class ConcreteFactory1 implements AbstractFactory{

    @Override
public AbstractProductA CreateProductA() {
return new ConcreteProductA1();
} @Override
public AbstractProductB CreateProductB() {
return new ConcreteProductB1();
} }

  AbstractProduct.java

interface AbstractProductA {
public void use();
}
interface AbstractProductB {
public void use();
}

  ConcreteProduct.java

class ConcreteProductA1 implements AbstractProductA{

    @Override
public void use() {
// TODO Auto-generated method stub
System.out.println("use A1 product!");
} }
class ConcreteProductB1 implements AbstractProductB{ @Override
public void use() {
// TODO Auto-generated method stub
System.out.println("use B1 product!");
} }

  使用方式

    public static void main(String[] args){
AbstractProductA pa;
AbstractProductB pb; AbstractFactory fa1 = new ConcreteFactory1();
pa = fa1.CreateProductA();
pb = fa1.CreateProductB();
pa.use();
pb.use(); AbstractFactory fa2 = new ConcreteFactory2();
pa = fa2.CreateProductA();
pb = fa2.CreateProductB();
pa.use();
pb.use(); }

  全部代码

 package com.designer;
interface AbstractFactory {
public AbstractProductA CreateProductA();
public AbstractProductB CreateProductB();
}
interface AbstractProductA {
public void use();
}
interface AbstractProductB {
public void use();
}
class ConcreteFactory1 implements AbstractFactory{ @Override
public AbstractProductA CreateProductA() {
return new ConcreteProductA1();
} @Override
public AbstractProductB CreateProductB() {
return new ConcreteProductB1();
} }
class ConcreteFactory2 implements AbstractFactory{ @Override
public AbstractProductA CreateProductA() {
return new ConcreteProductA2();
} @Override
public AbstractProductB CreateProductB() {
return new ConcreteProductB2();
} }
class ConcreteProductA1 implements AbstractProductA{ @Override
public void use() {
// TODO Auto-generated method stub
System.out.println("use A1 product!");
} }
class ConcreteProductA2 implements AbstractProductA{ @Override
public void use() {
// TODO Auto-generated method stub
System.out.println("use A2 product!");
} }
class ConcreteProductB1 implements AbstractProductB{ @Override
public void use() {
// TODO Auto-generated method stub
System.out.println("use B1 product!");
} }
class ConcreteProductB2 implements AbstractProductB{ @Override
public void use() {
// TODO Auto-generated method stub
System.out.println("use B2 product!");
} }
public class Client {
public static void main(String[] args){
AbstractProductA pa;
AbstractProductB pb; AbstractFactory fa1 = new ConcreteFactory1();
pa = fa1.CreateProductA();
pb = fa1.CreateProductB();
pa.use();
pb.use(); AbstractFactory fa2 = new ConcreteFactory2();
pa = fa2.CreateProductA();
pb = fa2.CreateProductB();
pa.use();
pb.use(); }
}

生活中的设计模式

  在生活中,我们经常会碰到使用一系列东西的时候。比如,我们愿意吃炸鸡配啤酒,喜欢吃爆米花配可乐。我们不关心炸鸡怎么炸的,啤酒怎么酿的,爆米花怎么爆的,而只关心我们吃什么,喝什么,这就是典型的抽象工厂。

  例如,大部分程序猿们都有吃早餐的习惯,当然很多人喜欢睡懒觉也来不及吃,但是为了身体健康,还是要按时吃饭才行!扯远了...

  有人喜欢吃中式的,有人喜欢吃西式的。那么去食堂我们不会去问,包子怎么做的,面包怎么烤的,仅仅是付费吃饭而已。而中式一般是豆浆油条,西式面包牛奶。这种搭配已经形成了一种习惯,也就是默认的产品组合。

  因此,我们在买单时,只要指定早餐的样式,就可以了。下面就是我们吃早餐,使用早餐工厂的流程...

interface BreakfastFactory{
public StapleFood MakeStapleFood();
public Drinks MakeDrinks();
}
interface StapleFood{
public void eating();
}
interface Drinks{
public void drinking();
}
class BreakfastCStyle implements BreakfastFactory{ @Override
public StapleFood MakeStapleFood() {
return new DeepFriedDoughSticks();
} @Override
public Drinks MakeDrinks() {
return new SoybeanMilk();
} }
class BreakfastWStyle implements BreakfastFactory { @Override
public StapleFood MakeStapleFood() {
return new Bread();
} @Override
public Drinks MakeDrinks() {
return new Milk();
} }
class DeepFriedDoughSticks implements StapleFood{
@Override
public void eating() {
System.out.println("我在吃油条!...");
}
}
class SoybeanMilk implements Drinks{
@Override
public void drinking() {
System.out.println("我在喝豆浆!...");
}
}
class Bread implements StapleFood{
@Override
public void eating() {
System.out.println("我在吃面包!...");
}
}
class Milk implements Drinks{
@Override
public void drinking() {
System.out.println("我在喝牛奶!...");
}
}
public class Breakfast{
public static void main(String[] args){
StapleFood sf;
Drinks dk;
System.out.println("——————————————————第一天——————————————————————————");
System.out.println("我要吃中式早餐");
BreakfastFactory bf1 = new BreakfastCStyle();
sf = bf1.MakeStapleFood();
dk = bf1.MakeDrinks();
sf.eating();
dk.drinking();
System.out.println("——————————————————第二天——————————————————————————");
System.out.println("我要吃西式早餐");
BreakfastFactory bf2 = new BreakfastWStyle();
sf = bf2.MakeStapleFood();
dk = bf2.MakeDrinks();
sf.eating();
dk.drinking();
}
}

  可以看到,非常方便的就迟到了中式和西式的早餐,而省掉了大量炸油条,烤面包的时间。

——————————————————第一天——————————————————————————
我要吃中式早餐
我在吃油条!...
我在喝豆浆!...
——————————————————第二天——————————————————————————
我要吃西式早餐
我在吃面包!...
我在喝牛奶!...

  这就是一个简单的抽象工厂的使用。

【转载声明】: by xingoo

【设计模式】——抽象工厂Abstract Factory的更多相关文章

  1. 设计模式——抽象工厂(Abstract Factory)

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. ——DP UML类图 模式说明 抽象工厂与工厂方法在定义上最明显的区别是“创建一系列相关或相互依赖对象的接口”,由此可以看出抽象工 ...

  2. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  3. 面向对象设计——抽象工厂(Abstract Factory)模式

    定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...

  4. 设计模式四: 抽象工厂(Abstract Factory)

    简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...

  5. 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式

    趁热打铁,紧跟着上一节的工厂方法模式.这一节介绍一下抽象工厂模式,以及分析俩个模式的不同 1.何为抽象模式? 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他 ...

  6. 工厂模式[3] 抽象工厂 Abstract Factory

    简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...

  7. C2:抽象工厂 Abstract Factory

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现.提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合 UM ...

  8. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  9. Headfirst设计模式的C++实现——抽象工厂(Abstract Factory)

    Dough.h #ifndef _DOUGH_H #define _DOUGH_H class Dough { }; #endif ThinCrustDough.h #ifndef _THIN_CRU ...

随机推荐

  1. 微信小程序开发 [03] 事件、数据绑定和传递

    1.事件绑定 在微信小程序中,事件的绑定依附于组件,当事件触发时,就会执行事件对应的处理函数. 我们回到前几章中的例子,将index页面调整为首页(app.json中调整pages数组元素的顺序),此 ...

  2. odoo之ERP系统

    odoo大纲 第一部分:数据库postgressql 大象 第二部分:ORM(API) 第三部分:客户端 用python软件写: .py文件 包含两部分:1.自定义部分,由自己写,定义类和功能. .继 ...

  3. Docker的Mysql数据库:把数据存储在本地目录

    Docker mysql 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 $ docker run -d -e MYSQL_ROOT_PASSWORD=admin --n ...

  4. XSS Challenges练习及解答

    一个偶然的机会在知道创宇的技能表里看到了一个练习XSS的网站http://xss-quiz.int21h.jp,正好想研究这个,于是试着做了一下. 第一.二题是最简单的,直接在搜索框中输入以下代码就成 ...

  5. javaScript之jQuery框架

    一.jQuery简介   jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨 ...

  6. 20155313 杨瀚 《网络对抗技术》实验五 MSF基础应用

    20155313 杨瀚 <网络对抗技术>实验五 MSF基础应用 一.实验目的 本实验目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.一个主动 ...

  7. 第五节 HTML&CSS -- 关于浮动和清除浮动的解说,以及两个大坑不要踩

    1.随便唠叨几句   这一节课我会对浮动元素和怎样清除浮动相关的技术进行一个讲解,同时,我会列举一些我们前端开发中常见的坑,希望大家以后不要在这些地方犯错.在开始今天的课程之前,有一个东西我需要先讲一 ...

  8. 汇编 循环位移指令 ROL, 循环位移指令 ROR

    知识点:  循环位移指令 ROL  循环位移指令 ROR 一.循环位移指令 ROL ROR int i=0x77886611;//01110111100010000110011000010001 ...

  9. MFC Timer定时器

    知识点: 定时器Timer 创建定时器 销毁定时器 代码测试 一. 创建定时器 UINT SetTimer( HWND hWnd, // 指定关联定时器的窗口句柄,在MFC版将省略此参数 UINT n ...

  10. STEAM 自动安装时提示C++ 安装不了等问题

    [情况] 今天安装游戏, 安装时自动安装 Visual C++ 2015 x64 Minimum Runtime ....不成功, 提示网络源不可使用, 或者使用以下安装源 C:\ProgramDat ...