角色组成
1.
抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在
java
中它由抽象类或者接口来实现。
2.
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在
java
中它由具体的类来实现。
3.
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在
java
中一般有抽象类或者接口来实现。
4.
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在
java
中由具体的类来实现。
水果:抽象产品
package
co.xiaowenzi.study;
public interface
Fruit {
//
送给客户
void
send();
}
package
co.xiaowenzi.study;
public class
Apple
implements
Fruit {
@Override
public void
send() {
System.
out
.println(
"
苹果已经种好,送给客户
"
);
}
}
package
co.xiaowenzi.study;
public class
Banana
implements
Fruit {
@Override
public void
send() {
System.
out
.println(
"
香蕉已经种好,送给客户
"
);
}
}
果农
:
抽象工厂
package
co.xiaowenzi.study;
public interface
Farmer {
public
Fruit
PlantTree
();
}
package
co.xiaowenzi.study;
public class
AppleFarmer
implements
Farmer {
@Override
public
Fruit PlantTree() {
System
.
out
.println(
"
苹果果农种植完成
"
);
return new
Apple();
}
}
package
co.xiaowenzi.study;
public class
BananaFarmer
implements
Farmer{
@Override
public
Fruit PlantTree() {
System.
out
.println(
"
香蕉果农种植完成
"
);
return new
Banana();
}
}
制造工厂
:
具体工厂和产品
package
co.xiaowenzi.study;
public class
FruitFactory {
/**
*
水果工厂,等待客户下单进行生产
*
@param
which
*
@return
*
@throws
Exception
*/
public static
Fruit factory(String
which
) {
//
利用反射来知道那种水果
,
找到对应的果农种植
Farmer
farmer
=
null
;
Fruit
fruit
=
null
;
try
{
farmer
= (Farmer) Class.
forName
(
"co.xiaowenzi.study."
+
which
+
"Farmer"
).newInstance();
if
(
farmer
!=
null
) {
fruit
=
farmer
.PlantTree();
}
}
catch
(InstantiationException
e
) {
//e.printStackTrace();
}
catch
(IllegalAccessException
e
) {
//e.printStackTrace();
}
catch
(ClassNotFoundException
e
) {
//e.printStackTrace();
}
return
fruit
;
}
}
客户
package
co.xiaowenzi.study;
public class
FruitCustomer {
@SuppressWarnings
(
"static-access"
)
public static void
main(String[]
args
){
//
客户下单香蕉,通知工厂生产
FruitFactory
fruitFactory
=
new
FruitFactory();
Fruit
fruit
=
fruitFactory
.
factory
(
"Apple"
);
if
(
fruit
!=
null
){
fruit
.send();
}
else
{
System.
out
.println(
"
种不出这种水果
"
);
}
}
}
与简单工厂模式相比:多了一个果农种植步奏。
例如简单工厂是:客户直接从水果工厂拿到水果,而不管水果是从哪里来的;
工厂方法:多了果农种植步奏,水果工厂得到客户需求,需要那种水果,然后通知相应的果农去种植,由果农返回水果到水果工厂,再提供给客户。