设计模式 - 抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory) 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

它可以看作是工厂方法模式(Factory Method)的扩展,相对于Factory Method创建一个对象, Abstract Factory 创建多个相关的对象。

设计模式 - 抽象工厂模式(Abstract Factory)_第1张图片

优点: 如果换产品系列,只需换相应的具体工厂即可; 客户代码与产品的具体实现分离。

缺点: 难以扩展新产品,如果要增加一个新产品,工厂的类层次中所有的工厂都要增加一个创建该产品的方法。


示例: 如苹果公司有手机和平板产品系列; 三星公司也有手机和平板产品系列;

AbstractFactory
Phone
Tablet
AppleFactory
iPhone iPad
SamsungFactory
Galaxy GalaxyTab

public interface AbstractFactory { //abstract factory
    public Phone createPhone();
    public Tablet createTablet();
}

public class AppleFactory implements AbstractFactory {
    private final String os = "iOS"; //同一工厂的产品系列有相关的属性
    public Phone createPhone() {
        return new IPhone("iPhone 8", os);
    };
    public Tablet createTablet() {
        return new IPAD("iPad Air2", os);
    };
}

public class SamsungFactory implements AbstractFactory {
    private String os = "Andriod";
    public Phone createPhone() {
        return new Galaxy("Galaxy 6", os);
    };
    public Tablet createTablet() {
        return new SamsungTab("Galaxy Tab2", os);
    };
}

public interface Phone {
    public String getName();
    public String getOS();
}
public class IPhone implements Phone {
    private final String name;
    private final String os;
    public IPhone(String name, String os) {
        this.name = name;
        this.os = os;
     }
    public String getName() {
        return name;
    }

    public String getOS() {
        return os;
    }
}
public class Galaxy implements Phone {
    private final String name;
    private final String os;
    public Galaxy(String name, String os) {
        this.name = name;
        this.os = os;
     }
    public String getName() {
        return name;
    }
    public String getOS() {
        return os;
    }
}

public interface Tablet {
    public String getName();
    public String getOS();
}
public class IPAD implements Tablet {
    private final String name;
    private final String os;
    public IPAD(String name, String os) {
        this.name = name;
        this.os = os;
    }
    public String getName() {
        return name;
    }
    public String getOS() {
        return os;
    }
}
public class SamsungTab implements Tablet {
    private final String name;
    private final String os;
    public SamsungTab(String name, String os) {
        this.name = name;
        this.os = os;
    }
    public String getName() {
        return name;
    }
    public String getOS() {
        return os;
    }
}


测试代码:

public class AbstractFactoryTest {
    public static void main(String[] args) {
        AbstractFactory factory = new AppleFactory();
//      AbstractFactory factory = new SamsungFactory(); //替换产品系列
        
        Tablet tablet  = factory.createTablet();
        System.out.println(tablet.getName());
        
        Phone phone = factory.createPhone();
        System.out.println(phone.getName());
    }
}
 
 

你可能感兴趣的:(模式与重构)