1.3_抽象工厂模式
抽象工厂模式的各个角色(和工厂方法的一样):
抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在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 BananaBig 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
* @throwsException
*/
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("没有这个农民");
}
}
}
与工厂方法不同的是:工厂方法是一种水果对应一个果农,例如苹果果农只有一种苹果种类;抽象工厂是一类水果对应一个果农,苹果果农可能有多种种类的苹果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.