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 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( " 没有这个农民 " );
       }
    }
}
与工厂方法不同的是:工厂方法是一种水果对应一个果农,例如苹果果农只有一种苹果种类;抽象工厂是一类水果对应一个果农,苹果果农可能有多种种类的苹果。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值