JAVA设计模式学习之----创建模式:工厂模式(工厂方法)
2008-12-24 11:40
831 查看
工厂模式分为工厂方法和抽象工厂。。
工厂模式用于生成对象。。。
一般我们生成对象使用new 如Person p = new Person();来实现,但我们在创建这个对象的时候可能要做一些其它的事情。。
当然java中通过重载构造函数可以实现如Person p = new Person(String name);,但通过增加参数的方法还是不能满足我们的需求,如是如果我要新建对象的时候要进行数据库的相关操作,那么采用重载构造函数的方法肯定会使构造函数中的代码相当长,不仅仅是因为不好看,主要是因为它违背了面向对象的设计原则:高内聚低耦合性。
好了,以Person类为例:现在有两个类继承Person,分别为Zhangshan,Zhangsi,那么我们采用工厂模式来产生对象,根据面向接口编程的原则我们将Person抽象成一个接口,那么有的人会说Zhangshan,Zhangsi实现Person接口然后实例化的时候用
Person p1 = new Zhangshan();
Person p2 = new Zhangsi();
不就要以了吗?为什么要工厂模式呢。
我们没有想到,有一天我们会有更多的类继承Person类,那么是不是我们都要使用Person pn = new ....的形式来产生实例呢?
显然不是明智之举。。。现在我们看工厂模式的代码:
首先Person接口:
package com.foactory.eus.interfaces;
public
interface
Person {
public
static
final String className =
"Person"
;
String getName();
int
getAge();
}
接口的实现类:Zhangshan
package com.foactory.eus.implement;
import com.foactory.eus.interfaces.Person;
public
class
Zhangshan implements Person{
/* (non-Javadoc)
* @see com.foactory.eus.interfaces.Person#getName()
*/
public
String getName() {
System.
out
.println(
"this is zhangshan is name"
);
return
""
;
}
public
int
getAge() {
return
0;
}
}
接口的实现类:Zhangsi
package com.foactory.eus.implement;
import com.foactory.eus.interfaces.Person;
public
class
Zhangsi implements Person {
/* (non-Javadoc)
* @see com.foactory.eus.interfaces.Person#getAge()
*/
public
int
getAge() {
// TODO Auto-generated method stub
return
0;
}
/* (non-Javadoc)
* @see com.foactory.eus.interfaces.Person#getName()
*/
public
String getName() {
// TODO Auto-generated method stub
System.
out
.println(
"this is zhangsi is name"
);
return
null
;
}
}
再看看工厂类及方法:PersonFactory
package com.foactory.eus.factory;
import com.foactory.eus.implement.Zhangshan;
import com.foactory.eus.implement.Zhangsi;
import com.foactory.eus.interfaces.Person;
public
class
PersonFactory {
public
static
Person instance(
int
which){
if
(which == 1){
return
new
Zhangshan();
}
else
{
return
new
Zhangsi();
}
}
public
static
void
main(String[] args){
Person p1 = PersonFactory.instance(1);
p1.getName();
Person p2 = PersonFactory.instance(2);
p2.getName();
}
}
if
(which == 2){
return
new
Zhangwu();
}
上面的main方法用来测试的,打印输出:
this
is
zhangshan
is
name
this
is
zhangsi
is
name
你可以看到这时候如果我们有新的Person的实现类的话,我们只需在PersonFactory 类中加入一段代码就可以了。
如增加
Zhangwu的实例如下:
if
(which == 2){
return
new
Zhangwu();
}
好了,上面讲的就是打工厂模式中的工厂方法了。如果系统不是很复杂,用这个就可以了。。。
工厂模式用于生成对象。。。
一般我们生成对象使用new 如Person p = new Person();来实现,但我们在创建这个对象的时候可能要做一些其它的事情。。
当然java中通过重载构造函数可以实现如Person p = new Person(String name);,但通过增加参数的方法还是不能满足我们的需求,如是如果我要新建对象的时候要进行数据库的相关操作,那么采用重载构造函数的方法肯定会使构造函数中的代码相当长,不仅仅是因为不好看,主要是因为它违背了面向对象的设计原则:高内聚低耦合性。
好了,以Person类为例:现在有两个类继承Person,分别为Zhangshan,Zhangsi,那么我们采用工厂模式来产生对象,根据面向接口编程的原则我们将Person抽象成一个接口,那么有的人会说Zhangshan,Zhangsi实现Person接口然后实例化的时候用
Person p1 = new Zhangshan();
Person p2 = new Zhangsi();
不就要以了吗?为什么要工厂模式呢。
我们没有想到,有一天我们会有更多的类继承Person类,那么是不是我们都要使用Person pn = new ....的形式来产生实例呢?
显然不是明智之举。。。现在我们看工厂模式的代码:
首先Person接口:
package com.foactory.eus.interfaces;
public
interface
Person {
public
static
final String className =
"Person"
;
String getName();
int
getAge();
}
接口的实现类:Zhangshan
package com.foactory.eus.implement;
import com.foactory.eus.interfaces.Person;
public
class
Zhangshan implements Person{
/* (non-Javadoc)
* @see com.foactory.eus.interfaces.Person#getName()
*/
public
String getName() {
System.
out
.println(
"this is zhangshan is name"
);
return
""
;
}
public
int
getAge() {
return
0;
}
}
接口的实现类:Zhangsi
package com.foactory.eus.implement;
import com.foactory.eus.interfaces.Person;
public
class
Zhangsi implements Person {
/* (non-Javadoc)
* @see com.foactory.eus.interfaces.Person#getAge()
*/
public
int
getAge() {
// TODO Auto-generated method stub
return
0;
}
/* (non-Javadoc)
* @see com.foactory.eus.interfaces.Person#getName()
*/
public
String getName() {
// TODO Auto-generated method stub
System.
out
.println(
"this is zhangsi is name"
);
return
null
;
}
}
再看看工厂类及方法:PersonFactory
package com.foactory.eus.factory;
import com.foactory.eus.implement.Zhangshan;
import com.foactory.eus.implement.Zhangsi;
import com.foactory.eus.interfaces.Person;
public
class
PersonFactory {
public
static
Person instance(
int
which){
if
(which == 1){
return
new
Zhangshan();
}
else
{
return
new
Zhangsi();
}
}
public
static
void
main(String[] args){
Person p1 = PersonFactory.instance(1);
p1.getName();
Person p2 = PersonFactory.instance(2);
p2.getName();
}
}
if
(which == 2){
return
new
Zhangwu();
}
上面的main方法用来测试的,打印输出:
this
is
zhangshan
is
name
this
is
zhangsi
is
name
你可以看到这时候如果我们有新的Person的实现类的话,我们只需在PersonFactory 类中加入一段代码就可以了。
如增加
Zhangwu的实例如下:
if
(which == 2){
return
new
Zhangwu();
}
好了,上面讲的就是打工厂模式中的工厂方法了。如果系统不是很复杂,用这个就可以了。。。
相关文章推荐
- java设计模式学习之工厂方法模式
- JAVA设计模式学习之----创建模式:工厂模式(抽象工厂)
- java设计模式-创建模式之 简单工厂,工厂方法和抽象工厂的区别总结
- java设计模式--创建模式--工厂方法
- java设计模式学习笔记之工厂方法模式
- java 设计模式-创建模式之工厂方法模式1
- Java设计模式之工厂方法模式——学习笔记
- java 设计模式-创建模式之工厂方法模式2
- JAVA学习--接口的应用:工厂方法的设计模式
- 学习设计模式:简单工厂、模板方法、单例(上)
- IOS设计模式学习(4)工厂方法
- Java设计模式知识学习-----普通工厂模式
- C++ 工厂方法设计模式的学习 (Boolan学习笔记第12周)
- Java设计模式学习之工厂模式
- 设计模式学习笔记四:工厂方法(Factory Method)
- 设计模式(一)----- 工厂方法(FactoryMethod)----(JAVA版)
- 设计模式之Factory,Java工厂方法
- Java设计模式之工厂方法模式
- Head First 设计模式学习——简单工厂方法-工厂方法模式-抽象工厂模式
- java设计模式 -------- 创建模式 之 简单工厂模式