美文网首页
设计模式(三)——抽象工厂模式

设计模式(三)——抽象工厂模式

作者: 沧海一粟谦 | 来源:发表于2018-08-16 17:23 被阅读5次

    抽象工厂模式

    抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。在抽象工厂中,接口是负责创建相关对象的工厂,不需要显示指定他们的类。提供了一种创建对象的最佳方式。

    角色

    • 抽象工厂类:具体工厂必须实现或继承的父类,在Java中可以用抽象类或者接口实现。
    • 具体工厂类:负责创建具体对象的类,包含具体的业务逻辑。
    • 抽象产品类:工厂类所创建对象实例的父类。
    • 具体产品类:工厂类创建的具体对象实例。
    • 这个类图描述的是抽象产品类与具体产品类之间的关系,从图中我们可以看出我们分别有IOrangeIApple两个接口,每个接口都有对应2个具体的实现类CNOrangeUSOrangeUSAppleCNApple。这里就构成了我们的抽象产品类与具体产品类。
    • 这个类图描述抽象工厂类与具体工厂类之间的关系。抽象工厂类AbstractFactory分别有2个方法getApplegetOrange,交于具体工厂类CNFactoryUSFactory实现具体逻辑。

    抽象产品类

    public interface IApple {
    
        void get();
    }
    
    public interface IOrange {
    
        void get();
    }
    

    具体产品类

    public class CNApple implements IApple {
    
        public void get() {
            System.out.println("我是中国苹果。");
        }
    }
    
    public class CNOrange implements IOrange {
    
        public void get() {
            System.out.println("我是中国橙子。");
        }
    }
    
    public class USApple implements IApple {
    
        public void get() {
            System.out.println("我是美国苹果。");
        }
    }
    
    public class USOrange implements IOrange {
    
        public void get() {
            System.out.println("我是美国橙子。");
        }
    }
    

    定义了4个具体对象实例类。

    抽象工厂类

    public interface AbstractFactory {
    
        IApple getApple();
    
        IOrange getOrange();
    }
    
    

    具体工厂类

    public class USFactory implements AbstractFactory {
    
        public IApple getApple() {
            return new USApple();
        }
    
        public IOrange getOrange() {
            return new USOrange();
        }
    
    }
    
    public class CNFactory implements AbstractFactory {
        public IApple getApple() {
            return new CNApple();
        }
    
        public IOrange getOrange() {
            return new CNOrange();
        }
    }
    

    测试

        public static void main(String[] args) {
                AbstractFactory usFactory = new USFactory();
    
                AbstractFactory cnFactory = new CNFactory();
    
                usFactory.getApple().get();
                usFactory.getOrange().get();
    
                cnFactory.getApple().get();
                cnFactory.getOrange().get();
    
        }
    

    运行结果:

    我是美国苹果。
    我是美国橙子。
    我是中国苹果。
    我是中国橙子。
    

    总结

    • 优点:可以将一个系列的产品族统一到一起创建;
    • 缺点:在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口;

    相关文章

      网友评论

          本文标题:设计模式(三)——抽象工厂模式

          本文链接:https://www.haomeiwen.com/subject/rownbftx.html