`
java从入门到放弃
  • 浏览: 43793 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

    抽象工厂,一看这个字面意思,还有抽象的工厂?就是看不见的工厂吗?

    我是不明白为什么要叫这个模式为“抽象工厂”,按照我的理解,这个抽象工厂模式,最应该叫做:多产品工厂模式,或者叫系列产品工厂模式,或者叫超级工厂方法模式(因为他是工厂方法的延伸)。总之叫他抽象工厂,是有点不准确的,不能做到望文知意。

   如果大家没有学过工厂方法,建议先学工厂方法。学会工厂方法,这个抽象工厂就非常非常简单了。

   百度百科上对于抽象工厂模式的定义拿出来:

 

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。
抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,
创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。
因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,
而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。
工厂类负责创建抽象产品的具体子类的实例。

大家心里肯定在骂娘了,这到底怎么理解啊?我是不是天生智商不足,根本看不懂百度百科说的啥?放心,我用最简单的方式给大家演示一下何为抽象工厂!

    首先想象一个应用场景:我开了一家生产电脑配件公司,专门生产鼠标和键盘,另外一个人看我生意好了,也来模仿我也开一家类似的公司,也生产鼠标和键盘,而且价格比我的还低,质量比我的还好。

   这个时候,就是抽象工厂发挥作用的时候了!!

  使用步骤:1、定义具体的产品(数个)和他的父类。2、定义具体的工厂(数个)和他的父类,3、调用

  

 //第一步,定义产品的父类和具体的产品

abstract class Keyboard{
	public abstract void printfName();//只有一个方法,打印自己的名字
}
abstract class Mouse{
	public abstract void printfName();//只有一个方法,打印自己的名字
}

class MyKeyboard extends Keyboard{
	public void printfName() {//打印自己的名字
		System.out.println("我是一个键盘,是我自己的公司生产的!!");
	}
}
class MyMouse extends Mouse{
	public void printfName() {//打印自己的名字
		System.out.println("我是一个鼠标,是我自己的公司生产的!!");
	}
}

 

第二步,定义工厂父类和子类

abstract class Factory{ //定义父类
	public abstract Keyboard createKeyboard(); //生产键盘
	public abstract Mouse createMouse(); //生产鼠标
}

class MyFactory extends Factory{ //定义我的工厂
	public Keyboard createKeyboard() {
		return new MyKeyboard();
	}
	public Mouse createMouse() {
		return new MyMouse();
	}
}

 

  

3、调用

Factory f=new MyFactory();
f.createKeyboard().printfName();
f.createMouse().printfName();

结果:
我是一个键盘,是我自己的公司生产的!!
我是一个鼠标,是我自己的公司生产的!!

 到这个时候,大家还没看到这个抽象工厂到底有什么牛的,还不如不用呢,对吧?但是,如果有一个公司叫做IBM,他发现做电脑还挺赚钱的,结果他也来抢老子的生意,那代码怎么写呢?请看:

class IbmMouse extends Mouse{ 
	public void printfName() {
		System.out.println("我是一个鼠标,来自IBM");
	}
}
class IbmKeyBoard extends Keyboard{
	public void printfName() {
		System.out.println("我是一个键盘,也来自IBM");
	}
}

class IbmFactory extends Factory{
	public Keyboard createKeyboard() {
		return new IbmKeyBoard();
	}
	public Mouse createMouse() {
		return new IbmMouse();
	}
}

 这时候,我们的客户端只要稍微改一下,就可以了把所有的产品都换成ibm公司的了!

	public static void main(String[] args) {
		Factory f=new IbmFactory();
		f.createKeyboard().printfName();
		f.createMouse().printfName();
	}

结果:

我是一个键盘,也来自IBM
我是一个鼠标,来自IBM

 

看到没,我们把所有的产品一次性全部换成IBM公司的,只需要稍微修改了一下调用方法那里,其他都原封不动,对于系统来说,这是非常非常棒的,因为,你不需要修改原有的类和逻辑,并且轻而易举得将新的类加入到系统中,这对于程序的解耦是非常有帮助的。

 

 这个就是抽象工厂的魅力!!他是工厂方法的一个扩展。他的名字应该叫超级工厂方法!!

 

如果你有更好的见解,欢迎留言!!

 

  

 

1
0
分享到:
评论
1 楼 faradayroger 2017-01-11  
简单易懂,追更

相关推荐

    《C++20设计模式》学习笔记-第3章工厂方法和抽象工厂模式学习代码

    《C++20设计模式》学习笔记-第3章工厂方法和抽象工厂模式学习代码

    设计模式常用设计模式介绍抽象工厂、生成器、工厂方法

    1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象...

    抽象工厂模式(Abstract Factory Pattern)

    要好好去读上面那个实例,虽然有点绕嘴,其实只要用心去读,分清了抽象工厂模式的各个角色,对理解设计模式是非常重要的。理解头绪,然后接合简单工厂模式、工厂方法模式对工厂家族的了解,再加上抽象工厂模式的意图...

    Head First 设计模式 JAVA源码

    第三讲:抽象工厂模式 第四讲:工厂模式在开发中的运用 第五讲:单例模式 第六讲:原型模式 第七讲:建造者模式 第八讲:装饰模式 第九讲:策略模式 第十讲:观察者模式 第十一讲:享元模式 第十二讲:代理...

    设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板.pptx

    2桥接模式:定义一个接口、两个类都实现该接口桥接模式:定义一个接口、两个类都实现该接口 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第3页。 logo 3组合模式:整体-部分,比如...

    Headfirst(四)工厂设计模式C++实现

    Headfirst第四章工厂模式,三种工厂模式 简单工厂模式 工厂模式 抽象工厂模式 C++实现 面向对象思想

    设计模式--C++

    3.1 Abstract Factory(抽象工厂)—对象创建型模式 57 3.2 Builder(生成器)—对象创建型模式 633.3 Factory Method(工厂方法)—对象创建型模式 70 3.4 Prototype(原型)—对象创建型模式 87 3.5 Singleton...

    《软件秘笈:设计模式那点事》郑阿奇(编者) -电子工业出版社

    在第1章软件设计模式概述后,从第2章到第24章诠释23个软件设计模式。 1 设计模式概述 1.1 计算机软件的发展现状 1.2 引入设计模式的必要性 1.3 软件设计遵循的基本原则 1.3.1 高内聚、低耦合 1.3.2 面向抽象...

    设计模式PPT.rar

    01第一讲简单工厂模式 02第二讲工厂方法模式 03第三讲抽象工厂模式 04第四讲工厂模式在开发中的运用 05第五讲单例模式 06第六讲原型模式 07第七讲建造者模式 08第八讲装饰模式 09第九讲策略模式 10第十讲观察者模式 ...

    讲解三层结构和抽象工厂模式的技巧

    大多少教员讲解抽象工厂的设计模式,学员无法理解,因为这个知识正如它的名字“抽象工厂”一样难于理解,导致很多教员反馈回来授课效果不好,那么如何讲解好这个知识点呢,我在实际的授课过程中总结了讲解这个难点的...

    研磨设计模式(完整带书签).part2.pdf

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

    研磨设计模式-part3

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

    设计模式-7种开发语言(C#、JAVA、JavaScript、C++、Python、Go、PHP).pdf

    第三节 工厂方法模式 第四节 抽象工厂模式 第五节 单例模式 第六节 外观模式 第七节 模板模式 第八节 组合模式 第九节 代理模式 第十节 命令模式 第十一节 观察者模式 第十二节 策略模式 第十三节 建造者模式 第十四...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第3章 适配器(adapter)模式 13 第4章 外观(facade)模式 27 第5章 合成(composite)模式 39 第6章 桥接(bridge)模式 52 第7章 职责型模式介绍 62 第8章 单例(singleton)模式 67 第9章 观察者(observer)模式 72 第10章 ...

    设计模式:可复用面向对象软件的基础--详细书签版

    3.1 abstract factory(抽象工厂)— 对象创建型模式 57 3.2 builder(生成器)—对象创建型 模式 63 3.3 factory method(工厂方法)— 对象创建型模式 70 3.4 prototype(原型)—对象创建型 模式 87 3.5 ...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    设计模式--可复用面向对象软件的基础

    3.1 ABSTRACT FACTORY(抽象工厂)——对象创建型模式 3.2 BUILDER(生成器)——对象创建型模式 3.3 FACTORY METHOD(工厂方法)——对象创建型模式 3.4 PROTOTYPE(原型)——对象创建型模式 3.5 SINGLETON(单件...

    软件设计师必读的书-设计模式

    3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype(原型)—对象创建型 模式 87 3.5 ...

    研磨设计模式-part2

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

    研磨设计模式-part4

    第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式...

Global site tag (gtag.js) - Google Analytics