工厂模式主要负责将大量有共通接口的类实例化,工场模式有以下几种形态
简单工厂(Simple Factory) 又称 静态工厂方法(Static Factory Method)
工厂方法(Factory Method) 又称 多态性工厂(Polymorphic Factory)
抽象工厂(Abstract Factory) 又称 工具箱(Kit or Toolkit)
先说简单工厂模式:
需求:一个水果工厂,为任何来的客人提供水果,现有水果Apple ,Banana,Orange
实现:
定义三个类Apple,Banana,Orange 让他们都实现Fruit接口
-----------------------
list
1
--------------------------------
public
class
FruitFactory
{
public
static
Fruit factory(String which)
{
if
(which.equalsIgnoreCase(
"
apple
"
)
{
return new Apple();
}
else
if
(which equalsIgnoreCase(
"
banana
"
))
{
return new Banana();
}
else
if
(which equalsIgnoreCase(
"
orange
"
))
{
return new Orange();
}
else
{
throw
RuntimeException(
"
no this fruit
"
);
}
}
}
-----------------------
list
1
--------------------------------
客人的需求实现
1
try
{
2
FruitFactory.factory(
"
apple
"
);
3
FruitFactory.factory(
"
banana
"
);
4
FruitFactory.factory(
"
orange
"
);
5
}
catch
(Exception e)
{
6
7
}
8
优点:分开了生产者和消费者的责任
缺点:所有的产品都出自一个工厂
造成问题:
1,当这个工厂出现问题时,损失惨重,不利于分散风险
2,当出现不同种类的水果(有不同接口的水果),工场内部既须要判断种类,又须要判断具体的产品。
比如这种结构:
1,水果接口Fruit
2,两个种类水果实现了Fruit接口 有籽水果 /无籽水果
3,所有有籽水果继承自有籽水果类 ,所有无籽水果继承自无籽水果类
这事如果客户要有籽西瓜,无籽西瓜 工厂类的实现
1
-----------------------
list
2
--------------------------------
2
public
class
FruitFactory
{
3
public
static
Fruit factory(String which,
boolean
hasSeed )
{
4
if
(hasSeed)
{
5
if
(which.equalsIgnoreCase(
"
watermelon
"
)
{
6
return
new
WatermelonOne();
7
}
else
if
(which equalsIgnoreCase(
"
orange
"
))
{
8
return
new
OrangeOne();
9
else
{
10
throw
RuntimeException(
"
no this fruit
"
);
11
}
12
}
else
{
13
if
(which.equalsIgnoreCase(
"
watermelon
"
)
{
14
return
new
WatermelonTwo();
15
}
else
if
(which equalsIgnoreCase(
"
orange
"
))
{
16
return
new
OrangeTwo();
17
else
{
18
throw
RuntimeException(
"
no this fruit
"
);
19
}
20
}
21
}
22
}
23
-----------------------
list
2
--------------------------------
24
接着试想一下,我有20个大分类,复杂的层次结构,那么这个工厂模式怎么维护。
总结一下:简单工厂方法,在一定程度上支持了开闭原则,当增加一种水果的时候符合开闭原则
但当增加一类水果(多种有共通特点的水果)时候,出现维护困难的问题。
这个时候引入工厂方法,工厂方法利用继承,解决了上边的问题。看看它是如何解决的。
简单来说:工厂方法就是为没一大类水果实现一个"简单工厂",这些"简单工厂"都实现一个共通的接口。
这样当然就解决了问题,添加一个大类的话,就添加一个简单工厂
在我们的日常生活中经常会遇到这样的情况,如要生产IBM-PC或者Apple ,每一台计算计又有Cpu和内存
IBM-PC Apple,Cpu 内存Ram 不是一类东西,这个时候如果简单的建立四个工厂类是不对的。解决办法:
1
-----------------------
list
3
--------------------------------
2
public
IbmPcFactory
{
3
public
Cpu CpuFactory(String cpuType)
{
4
return
new
IbmPcCpu(cpuType);
5
}
6
public
Ram RamFactory(String ramType)
{
7
return
new
IbmPcRam(ramType);
8
}
9
}
10
public
AppleFactory()
{
11
public
Cpu CpuFactory(String cpuType)
{
12
return
new
AppleCpu(cpuType);
13
}
14
public
Ram RamFactory(String ramType)
{
15
return
new
AppleRam(ramType);
16
}
17
}
18
-----------------------
list
3
--------------------------------
19
这个就使抽象工厂了,不过抽象工厂对开闭原则的支持不够好,只在机型的增加上支持开闭,在配件上就不行了。
对比三个工厂模式,<<Java与模式>>的作者的比喻更能让人明白问题。
1,话说女娲造人,开始用手捏,感觉太慢
2,所以女娲想出了办法,用一条绳子(简单工厂,告诉绳子怎么造人),放到泥堆里边,然後一抖,就出来一批人
(简单工厂须要一个接口,interface 人)
3,接着女娲想要男人和女人之分,所以造了两条绳子,阳绳和阴绳(工厂方法,两个工厂,告诉阳绳怎么造男人,
女绳怎么造女人),然後一下出来一批男人,一批女人
(工厂方法须要多个接口,interface 人 interface 绳 阳绳-阴绳实现绳 男人-女人实现人)
4,可女娲还想造点动物,而且动物也想分男女(其实应改是雌雄),那怎么办,改造两条绳子,让绳子也学会怎么
造动物(抽象工厂),这个时候抖一下绳子,阳绳出来的东西,长的像人的是男人,长的像动物的是雄动物,
(抽象工厂须要再多的接口 interface 人 interface 兽 interface 绳
阳绳-阴绳实现绳 男人-女人实现人 雌动物-雄动物实现兽)
阴绳出来的东西,长的像人的是女人,长的像动物的是雌动物
最后再回到实现上,看到在list 1中,出现了大量的
if(which.equalsIgnoreCase("xxx"){
return new Xxx();
}
试想如果产品上千,上万呢。那这个将是不可想想的。Java的动态load正好解决了这个问题
看看实现
1
public
class
FruitFactory
{
2
public
static
Fruit factory(String which)
{
3
try
{
4
Class clazz
=
Class.forName(which);
5
return
(Fruit)clazz.newInstance();
6
}
catch
(Exception e)
{
7
8
}
9
}
10
}
11
好了,这个时候无论增加多少类的产品都不是问题了,你只要让所有的产品实现Fruit接口,同时为每个产品
编写自己的类。完全符合开闭原则。
分享到:
相关推荐
java设计模式----抽象工厂模式,简单工厂模式代码 代码内部
Java设计模式中的工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。工厂模式的核心思想是将对象的创建过程封装起来,使得创建过程独立于使用过程,从而提高了代码的可扩展性和可维护性。在HeadFirst...
Java设计模式中的工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时,它不会直接创建,而是调用一个工厂对象来完成创建工作。这种模式的核心在于封装了对象...
例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...
2. 创建型模式:包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。这些模式主要关注对象的创建过程,使得代码更加灵活,易于管理和测试。 3. 结构型模式:包括适配器模式、桥接模式、组合模式、...
JAVA-设计模式-创建型模式-工厂模式
简单工厂模式是Java设计模式中创建型模式的一种,也被称为静态工厂方法模式。该模式的主要思想是由一个专门的工厂类来负责创建其他类的实例。简单工厂模式通过封装创建对象的过程,使得调用者无需关心对象的具体创建...
通常,这样的文章会包含代码示例,解释如何在Java中实现各种工厂模式,并可能探讨它们在实际项目中的应用场景。 在压缩包"Factory-Pattern"中,可能包含了相关的代码示例,这些示例可能涵盖了简单工厂、工厂方法...
在Java编程中,简单工厂模式通过一个中心工厂类来负责创建相关的对象,而无需让客户端代码直接new具体的产品类。这种方式提高了代码的可读性和可维护性,降低了系统的耦合度。 首先,我们来看一下简单工厂模式的...
java设计模式-创建者模式-简单工厂模式。详细的讲解了什么是工厂方法模式及应用场景和应用场景的代码事例。及各工厂模式的区别。
在Java中,抽象工厂模式提供了一种创建对象组的方式,使得这些对象属于同一族,并且能够遵循相同的接口,但具体的实现可以不同。 首先,我们来理解一下抽象工厂模式的主要组成: 1. **抽象工厂(Abstract Factory...
《Java与模式---闫宏》这本书是针对Java程序员深入理解设计模式的重要参考资料。设计模式是软件工程中的一个重要概念,它们代表了在特定上下文中解决常见问题的最佳实践。这本书结合了中国的道家思想,以一种独特的...
本文将详细介绍简单工厂模式的基本概念、原理以及在Java中的实现方式,并通过一个具体案例帮助读者更好地理解和应用这一模式。 #### 二、简单工厂模式简介 简单工厂模式的核心在于定义了一个工厂类,由该工厂类...
这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...
在Java编程语言中,工厂模式通常分为简单工厂模式、工厂方法模式和抽象工厂模式三种类型。这些模式都是围绕着一个中心思想:将对象的实例化过程封装起来,使代码更加灵活且易于维护。 1. **简单工厂模式**: 简单...
这个名为"JAVA设计模式例程-工厂模式-1"的压缩包文件提供了一个关于工厂模式的实例,可以帮助学习者更好地理解和应用这个模式。 工厂模式的核心思想是提供一个创建对象的接口,但让实现延迟到子类去做,这样做的...
简单工厂模式是软件设计模式中的一种基础模式,它属于创建型设计模式。在Java编程中,我们常常会遇到需要创建一系列相关或相互依赖的对象,而这些对象的创建过程可能会非常复杂。这时,简单工厂模式就提供了一种封装...
这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的解决方案的标准化描述,它们在软件工程中起到了重要的作用,帮助开发者创建可维护、可扩展且易于理解...
在Java编程语言中,工厂模式的应用广泛且实用。它主要分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。这里我们主要探讨基于Java的例子,即简单工厂模式。 简单工厂模式的核心思想是定义一个工厂类,这个...
抽象工厂模式是Java设计模式中的一种创建型模式,它提供了创建对象族的接口,而具体的对象族由子类决定。这种模式的主要目的是隔离接口与实现,使得客户端代码在更换产品族时无需修改,增强了软件的可扩展性和可维护...