抽象工厂模式

一、什么是抽象工厂模式?

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。  

二、产品族和产品等级结构

三、模式中包含的角色及其职责

    1、抽象工厂角色
        抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
    2、具体工厂角色 
        具体工厂角色是抽象工厂的一个实例,负责实例化某个产品族中的产品对象。
    3、抽象角色
        抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    4、具体角色
        抽象模式所创建的具体实例对象。

四、具体代码:

/**
 * @Title: apple.java
 * @Package
 * @Description: 抽象产品-苹果
 * @author xiaozhi
 * @date 2016年11月28日 下午4:48:23
 * @version V1.0
 */

public abstract class Apple implements Fruit {
    @Override
    public abstract void get();
}
/**
 * @Title: branana.java
 * @Package
 * @Description: 抽象产品-香蕉
 * @author xiaozhi
 * @date 2016年11月28日 下午4:48:33
 * @version V1.0
 */

public abstract class Banana implements Fruit {
    @Override
    public abstract void get();
}
/**   
* @Title: Fruit.java
* @Package 
* @Description: 水果抽象类
* @author xiaozhi   
* @date 2016年11月28日 下午4:50:26
* @version V1.0   
*/

public interface Fruit {
    public void get();
}
/**   
* @Title: FruitFactory.java
* @Package 
* @Description: 抽象水果工厂
* @author xiaozhi   
* @date 2016年11月29日 下午5:23:36
* @version V1.0   
*/

public interface FruitFactory {
    public Fruit getApple();
    public Fruit getBanana();
}
/**   
* @Title: NorthApple.java
* @Package 
* @Description: 实现  抽象产品-苹果 的 ----北方苹果
* @author xiaozhi   
* @date 2016年11月29日 下午5:12:36
* @version V1.0   
*/

public class NorthApple extends Apple {

    @Override
    public void get() {
         System.out.println("采集北方苹果");
    }

}
/**   
* @Title: NorthBanana.java
* @Package 
* @Description: 实现  抽象产品-香蕉 的 ----北方香蕉
* @author xiaozhi   
* @date 2016年11月29日 下午5:22:11
* @version V1.0   
*/

public class NorthBanana extends Banana {


    @Override
    public void get() {
         System.out.println("采集北方香蕉");
    }

}
/**   
* @Title: NorthFruit.java
* @Package 
* @Description: 实现  抽象水果工厂 的 --北方水果工厂
* @author xiaozhi   
* @date 2016年11月29日 下午5:26:22
* @version V1.0   
*/

public class NorthFruit implements FruitFactory {
    @Override
    public Fruit getApple() { 
        return new NorthApple();
    }
    @Override
    public Fruit getBanana() {  
        return new NorthBanana();
    }
}
/**   
* @Title: SouthApple.java
* @Package 
* @Description: 实现  抽象产品-苹果 的 ----南方苹果
* @author xiaozhi   
* @date 2016年11月29日 下午5:21:20
* @version V1.0   
*/

public class SouthApple extends Apple {
    @Override
    public void get() {
        System.out.println("采集南方苹果");
    }
}
/**   
* @Title: SouthBanana.java
* @Package 
* @Description: 实现  抽象产品-香蕉 的 ----南方香蕉
* @author xiaozhi   
* @date 2016年11月29日 下午5:22:52
* @version V1.0   
*/

public class SouthBanana extends Banana {
    @Override
    public void get() {
        System.out.println("采集南方香蕉");
    }
}
/**   
* @Title: SouthFruit.java
* @Package 
* @Description: 实现  抽象水果工厂 的 --南方水果工厂
* @author xiaozhi   
* @date 2016年11月29日 下午5:25:08
* @version V1.0   
*/
public class SouthFruit implements FruitFactory {
    @Override
    public Fruit getApple() {
        return new SouthApple();
    }

    @Override
    public Fruit getBanana() { 
        return new SouthBanana();
    }
}
/**   
* @Title: WenShiApple.java
* @Package 
* @Description: 扩展  抽象产品-苹果 的 ----温室苹果  
*              温室苹果为新增加的产品族,体现开闭原则。
* @author xiaozhi   
* @date 2016年11月29日 下午5:55:17
* @version V1.0   
*/

public class WenShiApple extends Apple { 
    @Override
    public void get() {
        System.out.println("采集温室苹果");
    }

}
/**   
* @Title: WenShiBanana.java
* @Package 
* @Description: 扩展  抽象产品-香蕉 的 ----温室香蕉  
*              温室香蕉为新增加的产品族,体现开闭原则。
* @author xiaozhi   
* @date 2016年11月29日 下午5:51:53
* @version V1.0   
*/

public class WenShiBanana extends Banana { 
    @Override
    public void get() {
        System.out.println("采集温室香蕉");
    }
}
/**   
* @Title: WenShiApple.java
* @Package 
* @Description: 扩展  抽象水果工厂 的 --温室水果工厂
*               温室工厂为新加入的产品族的工厂
* @author xiaozhi   
* @date 2016年11月29日 下午5:51:13
* @version V1.0   
*/

public class WenShiFactory implements FruitFactory {

    @Override
    public Fruit getApple() {
        return new WenShiApple() ;
    }

    @Override
    public Fruit getBanana() { 
        return new WenShiBanana();
    }
}
/**
 * @Title: MainClass.java
 * @Package
 * @Description: 分别生产 多个产品族的产品
 * @author xiaozhi
 * @date 2016年11月29日 下午5:27:23
 * @version V1.0
 */

public class MainClass {
    public static void main(String[] args) {
        // 创建北方水果工厂
        FruitFactory fruitFactory = new NorthFruit();
        // 生产北方苹果
        Fruit apple = fruitFactory.getApple();
        Fruit banana = fruitFactory.getBanana();
        // 采集北方苹果
        apple.get();
        // 采集北方香蕉
        banana.get();

        // 创建南方水果工厂
        FruitFactory fruitFactory1 = new SouthFruit();
        // 生产南方苹果
        Fruit apple1 = fruitFactory1.getApple();
        // 生产南方香蕉
        Fruit banana1 = fruitFactory1.getBanana();
        // 采集南方苹果
        apple1.get();
        // 采集南方香蕉
        banana1.get();

        /**
         * 温室产品为新扩展的产品族,在原有基础上直接添加,不需要修改原有代码,符合开闭原则
         */

        // 创建温室水果工厂
        FruitFactory fruitFactory2 = new WenShiFactory();
        // 生产温室苹果
        Fruit apple2 = fruitFactory2.getApple();
        // 生产温室香蕉
        Fruit banana2 = fruitFactory2.getBanana();
        // 采集温室苹果
        apple2.get();
        // 采集温室香蕉
        banana2.get();
    }
}

五、运行结果:

    采集北方苹果
    采集北方香蕉
    采集南方苹果
    采集南方香蕉
    采集温室苹果
    采集温室香蕉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值