Java设计模式之三(抽象工厂模式)
一、什么是抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。
二、产品族和产品等级结构
三、模式中包含的角色及其职责
1.抽象工厂(Creator)角色 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
2.具体工厂( Concrete Creator)角色 具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
3.抽象(Product)角色 抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体产品(Concrete Product)角色 抽象模式所创建的具体实例对象
总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。
代码实现:
抽象Fruit(水果)类:
package com.qianyan.product; public interface Fruit { /** * 采集 */ public void get(); }
抽象产品结构类(苹果、香蕉):
package com.qianyan.bean; import com.qianyan.product.Fruit; public abstract class Apple implements Fruit{ /** * 采集 */ public abstract void get(); }
package com.qianyan.bean; import com.qianyan.product.Fruit; public abstract class Banana implements Fruit{ /** * 采集 */ public abstract void get(); }
抽象产品类的实现:产品族(北方苹果、香蕉;南方苹果、香蕉):
package com.qianyan.bean.impl; import com.qianyan.bean.Apple; public class NorthApple extends Apple{ @Override public void get() { System.out.println("生产北方苹果!"); } }
package com.qianyan.bean.impl; import com.qianyan.bean.Banana; public class NorthBanana extends Banana{ @Override public void get() { System.out.println("生产北方香蕉!"); } }
package com.qianyan.bean.impl; import com.qianyan.bean.Apple; public class SourthApple extends Apple{ @Override public void get() { System.out.println("生产南方苹果!"); } }
package com.qianyan.bean.impl; import com.qianyan.bean.Banana; public class SourthBanana extends Banana{ @Override public void get() { System.out.println("生产南方香蕉!"); } }
抽象工厂类(对应产品结构类):
package com.qianyan.factory; import com.qianyan.product.Fruit; /** * 抽象工厂类 * @author hadoop * */ public interface FruitFactory { //获取苹果 public Fruit getApple(); //获取香蕉 public Fruit getBanana(); }
抽象工厂的实现类(对应产品族):
package com.qianyan.factory.impl; import com.qianyan.bean.impl.NorthApple; import com.qianyan.bean.impl.NorthBanana; import com.qianyan.factory.FruitFactory; import com.qianyan.product.Fruit; public class NorthFactory implements FruitFactory{ @Override public Fruit getApple() { return new NorthApple(); } @Override public Fruit getBanana() { return new NorthBanana(); } }
package com.qianyan.factory.impl; import com.qianyan.bean.impl.SourthApple; import com.qianyan.bean.impl.SourthBanana; import com.qianyan.factory.FruitFactory; import com.qianyan.product.Fruit; public class SourthFactory implements FruitFactory{ @Override public Fruit getApple() { return new SourthApple(); } @Override public Fruit getBanana() { return new SourthBanana(); } }
顾客类:
package com.qianyan.user; import com.qianyan.factory.impl.NorthFactory; import com.qianyan.factory.impl.SourthFactory; import com.qianyan.product.Fruit; public class Customer { public static void main(String[] args) throws Exception { //获得北方生产链 NorthFactory f1 = new NorthFactory(); //通过NorthFactory来获取北方Apple实例对象 Fruit northApple = f1.getApple(); northApple.get(); //通过NorthFactory来获取北方Banana实例对象 Fruit northBanana = f1.getBanana(); northBanana.get(); //获得南方生产链 SourthFactory f2 = new SourthFactory(); //通过SourthFactory来获取南方Apple实例对象 Fruit sourthApple = f2.getApple(); sourthApple.get(); //通过SourthFactory来获取南方Banana实力对象 Fruit sourthBanana = f2.getBanana(); sourthBanana.get(); } }