设计模式----抽象工厂

概述

抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂又称为其他工厂的工厂,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。

使用场景

  • 不要求依赖类实例如何被创建、组合和表达的表达
  • 系统有多个系列,而系统中只消费其中某一系列
  • 提供一个类库,以同样的接口出现,调用者不需要依赖具体实现。

优点

  • 抽象工厂模式将具体类的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展

缺点

  • 抽象工厂模式很难支持新系列的变化。这是因为抽象工厂接口中已经确定了可以被创建的系列集合,如果需要添加新系列,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变

代码示例

实现

一个基础接口定义了功能,子类实现该接口;然后定义一个工厂接口,具体工厂实现工厂接口;

新增基础接口的实现类,只需要同时新增一个工厂类,调用端就可以轻松调用新产品的代码

还是以工厂模式中的容器作为背景,之前的无论是普通工厂、多方法工厂、静态工厂,当新增实现类时都需要修改已存在的代码。下面看看增加工厂接口后的实现
定义基础接口

package com.designpattern.abstractfactory;

public interface Container {
    public void getName();
    public void getShap();
    public void getColor();
}

实现基础接口

package com.designpattern.abstractfactory;

public class Can implements Container {

    @Override
    public void getName() {
        // TODO Auto-generated method stub
        System.err.println("can name:can");
    }

    @Override
    public void getShap() {
        // TODO Auto-generated method stub
        System.err.println("can shap:cycle");
    }

    @Override
    public void getColor() {
        // TODO Auto-generated method stub
        System.err.println("can color:green");
    }

}
package com.designpattern.abstractfactory;

public class Cup implements Container {

    @Override
    public void getName() {
        // TODO Auto-generated method stub
        System.err.println("Cup name:Cup");
    }

    @Override
    public void getShap() {
        // TODO Auto-generated method stub
        System.err.println("Cup shap:cylinder");
    }

    @Override
    public void getColor() {
        // TODO Auto-generated method stub
        System.err.println("Cup Color:white");
    }

}
package com.designpattern.abstractfactory;

public class Bottle implements Container {

    @Override
    public void getName() {
        // TODO Auto-generated method stub
        System.err.println("bottle name:bottle");
    }

    @Override
    public void getShap() {
        // TODO Auto-generated method stub
        System.err.println("bottle shap:cylinder");
    }

    @Override
    public void getColor() {
        // TODO Auto-generated method stub
        System.err.println("bottle Color:black");
    }

}

定义工厂接口

package com.designpattern.abstractfactory;

public interface FactoryIntf {
    public Container getContainer();
}

实现工厂接口

package com.designpattern.abstractfactory;

public class FactoryBottle implements FactoryIntf {

    @Override
    public Container getContainer() {
        // TODO Auto-generated method stub
        return new Bottle();
    }

}
package com.designpattern.abstractfactory;

public class FactoryCan implements FactoryIntf {

    @Override
    public Container getContainer() {
        // TODO Auto-generated method stub
        return new Can();
    }

}
package com.designpattern.abstractfactory;

public class FactoryCup implements FactoryIntf {

    @Override
    public Container getContainer() {
        // TODO Auto-generated method stub
        return new Cup();
    }

}

测试

package com.designpattern.abstractfactory;

public class TestMain {

    public static void main(String[] args) {
        FactoryIntf factoryIntf = new FactoryBottle();
        factoryIntf.getContainer().getName();

    }
}

运行结果:

bottle name:bottle

现在若需要研发一个新的产品,比如托盘
只需要新增一个基础接口的实现类和一个工厂的实现类,无需修改原来的代码

package com.designpattern.abstractfactory;

public class Salver implements Container {

    @Override
    public void getName() {
        // TODO Auto-generated method stub
        System.err.println("Salver name:Salver ");
    }

    @Override
    public void getShap() {
        // TODO Auto-generated method stub
        System.err.println("Salver  shap:cylinder");
    }

    @Override
    public void getColor() {
        // TODO Auto-generated method stub
        System.err.println("Salver  Color:white");
    }
}
package com.designpattern.abstractfactory;

public class FactorySalver implements FactoryIntf {

    @Override
    public Container getContainer() {
        // TODO Auto-generated method stub
        return new Salver();
    }

}

上面的例子是最基础的例子,比如增加相互依赖的对象
比如:在工厂模式里使用了生产容器的例子,那么在抽象工厂模式中我们增加一个包装接口,包装分别有大、小。要求杯子只能用小包装,瓶子只能用大包装等……

package com.designpattern.abstractfactory;

public interface Package {

    public void getPackageSize();
}
package com.designpattern.abstractfactory;

public class BigPackage implements Package {

    @Override
    public void getPackageSize() {
        // TODO Auto-generated method stub
        System.err.println("BigPackage");
    }

}
package com.designpattern.abstractfactory;

public class SmallPackage implements Package {

    @Override
    public void getPackageSize() {
        // TODO Auto-generated method stub
        System.err.println("smallPackage");
    }

}
package com.designpattern.abstractfactory;

public class FactoryBottle implements FactoryIntf {

    @Override
    public Container getContainer() {
        // TODO Auto-generated method stub
        return new Bottle();
    }

    @Override
    public Package getPackage() {
        // TODO Auto-generated method stub
        return new BigPackage();
    }

}
package com.designpattern.abstractfactory;

public class FactoryCup implements FactoryIntf {

    @Override
    public Container getContainer() {
        // TODO Auto-generated method stub
        return new Cup();
    }
    @Override
    public Package getPackage() {
        // TODO Auto-generated method stub
        return new SmallPackage();
    }
}
package com.designpattern.abstractfactory;

public class TestMain {

    public static void main(String[] args) {
        FactoryIntf factoryIntf = new FactoryBottle();
        factoryIntf.getContainer().getName();
        factoryIntf.getPackage().getPackageSize();
    }
}

运行结果:

bottle name:bottle
BigPackage

在该基础之上增加一种包装:中,要求can要用中包装

package com.designpattern.abstractfactory;

public class MidPackage implements Package {

    @Override
    public void getPackageSize() {
        // TODO Auto-generated method stub
        System.err.println("MidPackage");
    }

}
package com.designpattern.abstractfactory;

public class FactoryCan implements FactoryIntf {

    @Override
    public Container getContainer() {
        // TODO Auto-generated method stub
        return new Can();
    }
    @Override
    public Package getPackage() {
        // TODO Auto-generated method stub
        return new MidPackage();
    }
}

猜你喜欢

转载自blog.csdn.net/yue530tomtom/article/details/79701638