抽象工厂模式的各个角色(和工厂方法的一样):
抽象工厂角色:
这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在
java
中它由抽象类或者接口来实现。
具体工厂角色:
它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在
java
中它由具体的类来实现。
抽象产品角色:
它是具体产品继承的父类或者是实现的接口。在
java
中一般有抽象类或者接口来实现。
具体产品角色:
具体工厂角色所创建的对象就是此角色的实例。在
java
中由具体的类来实现。
它和工厂方法模式的区别就在于需要创建对象的复杂程度上。
而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。而且使用抽象工厂模式还要满足一下条件:
1.
系统中有多个产品族,而系统一次只可能消费其中一族产品
2.
同属于同一个产品族的产品以其使用。
苹果种类
package
co.xiaowenzi.study;
public interface
Apple
{
public void
appleType();
}
package
co.xiaowenzi.study;
public class
AppleBig
implements
Apple{
@Override
public void
appleType() {
System.
out
.println(
"
大苹果
"
);
}
}
package
co.xiaowenzi.study;
public class
AppleSmall
implements
Apple{
@Override
public void
appleType() {
System.
out
.println(
"
小苹果
"
);
}
}
香蕉种类
package
co.xiaowenzi.study;
public interface
Banana{
public void
bananaType();
}
package
co.xiaowenzi.study;
public class Banana
Big
implements
Banana{
@Override
public void
bananaType() {
System.
out
.println(
"
大香蕉
"
);
}
}
package
co.xiaowenzi.study;
public class
BananaSmall
implements
Banana{
@Override
public void
bananaType() {
System
.
out
.println(
"
小香蕉
"
);
}
}
果农:种植大苹果和大香蕉/种植小苹果和小香蕉
package
co.xiaowenzi.study;
public interface
Farmer {
public
Apple PlantAppleTree();
public
Banana
PlantBananaTree();
}
package
co.xiaowenzi.study;
public class
FarmerBig
implements
Farmer {
@Override
public
Apple PlantAppleTree() {
return new
AppleBig();
}
@Override
public
Banana PlantBananaTree() {
return new
BananaBig();
}
}
package
co.xiaowenzi.study;
public class
FarmerSmall
implements
Farmer {
@Override
public
Apple PlantAppleTree() {
return new
AppleSmall();
}
@Override
public
Banana PlantBananaTree() {
return new
BananaSmall();
}
}
工厂
package
co.xiaowenzi.study;
public class
FruitFactory {
/**
*
水果工厂,等待客户下单进行生产
*
@param
which
*
@return
*
@throws
Exception
*/
public static
Farmer factory(String
which
) {
//
利用反射来知道那种水果
,
找到对应的果农种植
Farmer
farmer
=
null
;
if
(
which
.equals(
"Big"
)) {
farmer
=
new
FarmerBig();
}
elseif
(
which
.equals(
"Small"
)) {
farmer
=
new
FarmerSmall();
}
return
farmer
;
}
}
客户
package
co.xiaowenzi.study;
public class
FruitCustomer {
@SuppressWarnings
(
" static -access"
)
public static void
main(String[]
args
){
//
客户下单香蕉,通知工厂生产
FruitFactory
fruitFactory
=
new
FruitFactory();
Farmer
farmer
=
fruitFactory
.
factory
(
"Big"
);
if
(
farmer
!=
null
){
Apple
apple
=
farmer
.PlantAppleTree();
Banana
banana
=
farmer
.PlantBananaTree();
apple
.appleType();
banana
.bananaType();
}
else
{
System.
out
.println(
"
没有这个农民
"
);
}
}
}
与工厂方法不同的是:工厂方法是一种水果对应一个果农,例如苹果果农只有一种苹果种类;抽象工厂是一类水果对应一个果农,苹果果农可能有多种种类的苹果。