Java设计模式之创建型模式-抽象工厂模式(Abstract Factory)

来源:互联网 发布:手机找工作软件 编辑:程序博客网 时间:2024/05/21 10:28

  关于设计模式的学习,中间断开也有一段时间了,现在继续补上。
  刚接触这个模式的时候其实也和工厂模式搞混了,不过静下心来仔细地理理也算清楚了。
  在开始讲抽象工厂模式之前,我这里先引入两个概念(刚开始绕了半天),以便更好地了解抽象工厂模式(例子我还是用之前讲工厂模式小米和苹果的例子):

  1. 产品层次结构: 产品层次结构就是产品的继承结构。比如我们有一个抽象类或者接口是手机,它的子类有苹果手机、小米手机、华为手机等具体的手机,那么抽象的手机和具体的手机这便构成了一个产品层次结构。抽象手机作为父类或者父接口,而具体品牌的手机则作为其子类。

  2. 产品族: 在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品层次结构中的一组产品。比如苹果电子工厂生产的苹果手机、苹果电脑,苹果手机位于手机产品层次结构中,苹果电脑位于电脑产品层次结构中,那么苹果手机和苹果电脑就构成了一个产品族。

    抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,无需指定他们的具体的类,从而创建多个产品族中的产品对象。

满足条件

抽象工厂模式需要满足以下的条件:
  1. 系统当中有多个产品族,而且系统一次只可能消费其中一族产品;
   2 . 同属于同一个产品族的产品以供其使用;  

实现方式

  1.创建一个Phone接口(抽象类,普通Java类都行)

public interface Phone {    void call();}

  2.创建实现Phone接口的具体产品类IPhone、MiPhone

public class IPhone implements Phone {    public void call() {        System.out.println("IPhone call...");    }}
public class MiPhone implements Phone {    public void call() {        System.out.println("MiPhone call...");    }}

  3.创建一个Computer接口

public interface Computer {    void play();}

  4.创建实现Computer接口的具体产品类IComputer、MiComputer

public class IComputer implements Computer {    @Override    public void play() {        System.out.println("IComputer play...");    }}
public class MiComputer implements Computer {    @Override    public void play() {        System.out.println("MiComputer play...");    }}

  5.创建一个抽象的工厂Factory

public interface Factory {    Phone createPhone();    Computer createComputer();}

  6.创建实现Factory接口的具体工厂类IFactory、MiFactory

public class IFactory implements Factory {    @Override    public Phone createPhone() {        return new IPhone();    }    @Override    public Computer createComputer() {        return new IComputer();    }}
public class MiFactory implements Factory {    @Override    public Phone createPhone() {        return new MiPhone();    }    @Override    public Computer createComputer() {        return new MiComputer();    }}

  7.抽象工厂测试类

public class AbstractFactoryTest {    public static void main(String[] args) {        Factory f = new IFactory();        Computer c = f.createComputer();        c.play();    }}

  这里跟我之前引入概念中所说的一样,IPhone和MiPhone属于同一产品层次结构,同理IComputer和MiComputer也一样。而IPhone和IComputer属于同一产品族。

缺点与不足

  我们在使用抽象工厂模式的时候,但凡我们需要增加新的产品层次结构,我们就需要新增原有层次结构对应数量的产品类,同时还要修改对应数量的工厂类,这样大批量的修改显然是不合适的。

优化改进

  针对上述的问题,利用简单工厂和反射结合的方式来改进抽象工厂:
  上述步骤1.2.3.4保持不变。我们从上述步骤5.创建一个抽象的工厂Factory开始做修改。

public class Factory {    public static Phone createPhone(Class clazz) throws Exception {        return (Phone) clazz.newInstance();    }    public static Computer createComputer(Class clazz) throws Exception {        return (Computer) clazz.newInstance();    }}

  之前的步骤6我们也不需要了,直接写个抽象工厂测试类测试下:

public class AbstractFactoryTest {    public static void main(String[] args) throws Exception {        Computer c = Factory.createComputer(MiComputer.class);        c.play();    }}

输出:

MiComputer play...
阅读全文
0 0
原创粉丝点击