设计模式一、 工厂方法模式(Factory Method Pattern)
一、概念:定义一个用于创建对象的接口,让子类决定将哪个工厂类实例化。
(Factory Method使得一个类的实例化延迟到其子类)
二、目的:解决接口选择的问题。
三、方式:让其子类实现方法接口,重写接口中的方法;不同的子类中,不同的实现。
四、使用的条件:明确的计划,不同的条件下创建不同的实例。
作为一种创建类模式,任何需要生成复杂对象的地方,都可以使用工厂方法模式。
五、优点和缺点:
优点:如果想要创建一个对象,只需要知道名称即可;
如果想要增加一种产品,只需要扩展一个工厂类即可;
调用者只需要明确产品的接口即可,不需要知道产品的具体实现。
缺点:
每次增加一个产品,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,增加了系统的复杂度;
也增加了系统具体类的依赖。
六、实现:
整个工厂方法模式由四大部分组成——接口、接口的实现类、工厂类、主函数。
举个例子来说:
1、创建一个接口,在这个接口中封装了一个方法,比如生产汽车发动机的方法;
2、然后再创建几个类,去实现这个接口,重写该接口中的方法,比如一个类里是生产宝马的发动机的方法、一个类是生产奔驰的发动机的方法、还有一个是生产大众的发动机的方法;
3、
创建工厂类,基于给定的信息,创建对应的实体类的对象;
4、创建一个包含主函数的类,使用工厂类的方法传递信息,获取相应实体类的对象,然后调用对应的方法。
七、下面就是用java具体实现工厂方法模式了(与例子中的方法顺序对应)——
1、创建接口
package
com.zyc.Factory_Pattern
;
/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:09:56
* To change this template use File | Settings | File Templates.
*/
public interface
Shape
{
void
draw
()
;
}
2、创建接口的实现类
第一个实现类Circle:
package
com.zyc.Factory_Pattern
;
/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:09:57
* To change this template use File | Settings | File Templates.
*/
//画圆
public class
Circle
implements
Shape
{
@Override
public void
draw
()
{
System
.
out
.
println
(
"画画:画圆形的方法...."
)
;
}
}
第二个实现类Triangle:
package
com.zyc.Factory_Pattern
;
/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:10:05
* To change this template use File | Settings | File Templates.
*/
public class
Triangle
implements
Shape
{
@Override
public void
draw
()
{
System
.
out
.
println
(
"画画:画三角形的方法...."
)
;
}
}
第三个实现类Rectangle:
package
com.zyc.Factory_Pattern
;
/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:10:10
* To change this template use File | Settings | File Templates.
*/
public class
Rectangle
implements
Shape
{
@Override
public void
draw
()
{
System
.
out
.
println
(
"画画:画矩形的方法...."
)
;
}
}
3、创建工厂类
package
com.zyc.Factory_Pattern
;
/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:10:19
* To change this template use File | Settings | File Templates.
*/
//创建工厂类,基于给定的信息,创建对应的实体类的对象
public class
Factory
{
//getShape()方法:通过匹配参数值,获取相应实体类的对象
public
Shape
getShape
(
String
type
)
{
if
(
type
==
null
)
{
return null
;
}
else if
(
type
.
equalsIgnoreCase
(
"CIRCLE"
))
{
return new
Circle
()
;
}
else if
(
type
.
equalsIgnoreCase
(
"RECTANGLE"
))
{
return new
Rectangle
()
;
}
else if
(
type
.
equalsIgnoreCase
(
"TRIANGLE"
))
{
return new
Triangle
()
;
}
return null
;
}
}
4、创建该工厂的使用类(主函数)
package
com.zyc.Factory_Pattern
;
import
java.util.Scanner
;
/**
* ------------------------------------
* Create with IntelliJ IDEA
* Author:Pink Panther
* Date:2018/6/14
* Time:10:34
* To change this template use File | Settings | File Templates.
*/
//使用工厂类传递信息,获取相应实体类的对象
public class
Factory_demo
{
public static void
main
(
String
[]
args
)
{
//实例化工厂类的对象
Factory
ft
=
new
Factory
()
;
String
str
=
null
;
String
str1
=
"没有该方法"
;
/*1、默认输入
//通过向gteShape(String type)方法中传入的参数,return得到相应的对象
Shape first=ft.getShape ("CIRCLE");
//用得到的对象去调用对应的方法
first.draw ();
Shape second=ft.getShape ("RECTANGLE");
second.draw ();
Shape third=ft.getShape ("TRIANGLE");
third.draw ();*/
//2、通过获取键盘输入,得到信息
Scanner
sc
=
new
Scanner
(
System
.
in
)
;
while
(
sc
.
hasNext
())
{
str
=
sc
.
next
()
;
if
(
str
.
equals
(
"CIRCLE"
))
{
new
Circle
()
.
draw
()
;
}
else if
(
str
.
equals
(
"RECTANGLE"
))
{
new
Rectangle
()
.
draw
()
;
}
else if
(
str
.
equals
(
"TRIANGLE"
))
{
new
Triangle
()
.
draw
()
;
}
else
System
.
out
.
println
(
str1
)
;
}
}
}
运行结果如下所示: