构造型模式之Abstract Factory(抽象工厂)模式

来源:互联网 发布:淘宝网卖什么比较畅销 编辑:程序博客网 时间:2024/05/29 11:43

1.如果你期望构造一系列具有某个公共特性的对象,可使用Abstract Factory(抽象工厂)模式
2.举例(在工厂方法模式基础上添加和修改)

//工厂抽象类public abstract class Factory {    abstract <T> T createProduct(T t);    abstract String getFactoryName();}
//添加另外产品接口public interface IProductOther {    void twe();    void setFactoryName(String string);}
//另外产品Apublic class ProductOtherA implements IProductOther{    @Override    public void twe() {        // TODO Auto-generated method stub        System.out.println("twe ProductOtherA");    }    @Override    public void setFactoryName(String string) {        // TODO Auto-generated method stub        System.out.println(string + "->" + "ProductOtherA");    }}
//另外产品Bpublic class ProductOtherB implements IProductOther{    @Override    public void twe() {        // TODO Auto-generated method stub        System.out.println("twe ProductOtherB");    }    @Override    public void setFactoryName(String string) {        // TODO Auto-generated method stub        System.out.println(string + "->" + "ProductOtherB");    }}
//第一个工厂:只能生产IProduct相关产品public class FirstFactory extends Factory{    @Override    <T> T createProduct(T t) {        // TODO Auto-generated method stub        T product = null;        try {            product = (T)Class.forName(t.getClass().getName()).newInstance();               if(product instanceof IProduct){                                ((IProduct) product).setFactoryName(getFactoryName());                return product;            }        } catch (InstantiationException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IllegalAccessException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }    @Override    String getFactoryName() {        // TODO Auto-generated method stub        return "FirstFactory";    }}
//第二个工厂:可以生产所有产品的全能工厂public class SecondFactory extends Factory{    @Override    <T> T createProduct(T t) {        // TODO Auto-generated method stub        T product = null;        try {            product = (T)Class.forName(t.getClass().getName()).newInstance();            if(product instanceof IProduct){                ((IProduct) product).setFactoryName(getFactoryName());            } else if (product instanceof IProductOther) {                ((IProductOther) product).setFactoryName(getFactoryName());            }        } catch (InstantiationException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IllegalAccessException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        };        return product;    }    @Override    String getFactoryName() {        // TODO Auto-generated method stub        return "SecondFactory";    }}
//测试类public class Test {    public static void main(String[] args){        Factory ff = new FirstFactory();        IProduct a1 = ff.createProduct(new ProductA());        IProduct b1 = ff.createProduct(new ProductB());        IProductOther aO1 = ff.createProduct(new ProductOtherA());        Factory sf = new SecondFactory();        IProduct a2 = sf.createProduct(new ProductA());        IProductOther bO2 = sf.createProduct(new ProductOtherB());        if(a1 != null){            a1.one();        } else {            System.out.println("a1 == null");        }        if(b1 != null){            b1.one();        } else {            System.out.println("b1 == null");        }        if(aO1 != null){            aO1.twe();        } else {            System.out.println("aO1 == null");        }        if(a2 != null){            a2.one();        } else {            System.out.println("a2 == null");        }        if(bO2 != null){            bO2.twe();        } else {            System.out.println("bO2 == null");        }    }}
//结果FirstFactory->ProductAFirstFactory->ProductBSecondFactory->ProductASecondFactory->ProductOtherBone productAone ProductBaO1 == nullone productAtwe ProductOtherB

3.总结:Abstract Factory(抽象工厂)模式的意图在于创建一系列相关联或互相依赖的对象。借助该模式,可以为客户提供工厂类,每个工厂类都可用于创建一系列与某一公共主题相关的对象。
4.工厂方法模式与抽象工厂的区别
4.1工厂方法模式是对一个系列的对象进行创建,而抽象工厂模式是对工厂方法模式的扩展,使得可以对多个系列的对象进行创建
4.2在我看来,工厂模式始终是一对多关系,抽象工厂模式可以针对需求定义成可以生产所有产品的全能工厂,或者定义多个成只能生产特别产品的工厂(即多个工厂方法模式)。
参考:http://www.cnblogs.com/devinzhang/archive/2011/12/19/2293160.html这里写链接内容

0 0
原创粉丝点击