`
java从入门到放弃
  • 浏览: 44778 次
  • 性别: 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 描述对象...

    《Java设计模式》课后答案-刘伟.rar

    创建型设计模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),它们主要关注对象的创建过程,使得代码更加灵活且易于扩展。 结构型设计...

    设计模式_--_工厂模式和单件模式

    ### 设计模式——工厂模式与单例模式 #### 一、引言 设计模式是软件工程领域中的一个重要概念,它代表了在特定情况下解决常见问题的最佳实践。在本篇文章中,我们将深入探讨两种广泛使用的软件设计模式:工厂模式...

    第三讲:抽象工厂模式

    抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。这种模式在软件工程中被广泛应用,尤其是在涉及跨平台开发或者需要构建复杂的对象组合时。 在编程中,我们...

    [浪曦原创]JAVA设计模式 第4讲 抽象工厂(jzkangta)

    在Java设计模式的课程中,"第4讲 抽象工厂(jzkangta)"可能包括对抽象工厂模式的详细讲解,例如通过实例展示了如何创建和使用抽象工厂,以及如何设计和实现抽象工厂模式。提供的材料如`抽象工厂模式.pdf`和`抽象工厂...

    C# Winform抽象工厂架构

    "C# Winform抽象工厂架构"是一个基于C#语言和Windows Forms(Winform)平台,利用抽象工厂设计模式构建的多层架构项目。在这个项目中,开发者使用了抽象工厂模式来创建和管理报表查询的相关组件,同时结合了反射机制...

    抽象工厂模式在net多层分布式程序中的应用.pdf

    抽象工厂模式是一种创建型设计模式,它提供了一种方法来创建一系列相关或相互依赖的对象,而无需指定具体的类。这种模式的主要组成部分包括: - **客户端(Client)**:使用由`AbstractFactory`和`AbstractProduct`...

    asp.net CMS 使用抽象工厂模式开发

    抽象工厂模式是设计模式中的一种,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在ASP.NET MVC框架下,这种模式可以帮助我们更好地实现多层架构,确保业务逻辑与呈现层的分离。 在ASP...

    吉林大学设计模式2012第七题1

    总结来说,吉林大学设计模式2012年第七题的重点在于理解并应用抽象工厂模式。通过创建抽象工厂和具体工厂,以及抽象产品和具体产品,我们可以构建出一个灵活且可扩展的系统,能够在不同的环境下生成符合需求的对象。

    简单三层架构+抽象工厂登陆设计

    在登录设计中,抽象工厂可以用来创建不同类型的用户验证服务,比如本地数据库验证、第三方OAuth验证等。通过工厂方法,我们可以根据不同的环境条件或配置动态地选择实现。 例如,我们可能有一个`...

    新版设计模式手册 - C#设计模式(第二版)

    《新版设计模式手册 - C#设计模式(第二版)》是一部深入探讨C#编程中设计模式的权威指南,尤其适合已经有一定C#基础并希望提升软件设计能力的开发者阅读。设计模式是解决软件开发中常见问题的经验总结,是软件工程的...

    Java设计模式之抽象工厂模式.docx

    抽象工厂模式的优势在于它可以灵活地扩展,当需要添加新的产品族(例如棕色人种)或者产品等级结构(例如增加第三个性别)时,只需添加新的抽象类和实现类,而无需修改现有的代码。同时,它也封装了对象的创建过程,...

    面向对象技术-简单工厂设计模式

    在描述中提到的"第八讲 设计模式( I )"中,提到了设计模式的三个主要元素:背景、问题和解决方案。背景是指适合应用设计模式的场景,问题是在这个背景下需要解决的关键挑战,而解决方案则是设计模式提供的经典设计...

    第5讲 工厂模式(简单工厂、抽象工厂)

    工厂模式是一种设计模式,主要用来解决对象创建的问题,特别是当有多个相关联的具体类需要实例化,而这些实例化操作可能会随着需求的变化而变化时。工厂模式的核心思想是定义一个创建对象的接口(或者抽象类),但让...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    设计模式分为三大类:创建型、结构型和行为型模式。这些模式在Java编程中扮演着关键角色,提高了代码的可读性、可维护性和可扩展性。 1. **创建型模式**:包括单例(Singleton)、工厂方法(Factory Method)、抽象...

    Head First 设计模式 JAVA源码

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

    设计模式之蝉

    “抽象工厂模式”(Abstract Factory pattern)也被简要提及,它是另一个创建型设计模式,用于创建一系列相关或相互依赖的对象。抽象工厂模式与工厂模式的不同之处在于,它不仅仅关注单一产品的创建,而是关注产品...

    23设计模式的高清彩图-独家资源!

    - **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 - **建造者模式**:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - **原型模式**:用...

Global site tag (gtag.js) - Google Analytics