美文网首页
设计模式之抽象工厂模式

设计模式之抽象工厂模式

作者: 官先生Y | 来源:发表于2017-01-06 10:30 被阅读9次

    定义

    抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families of related or dependent objects without specifying their concrete classes"。翻译为以下:
    为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体实现类。

    使用场景

    一个对象族有相同的约束时可以使用抽象工厂模式。以车厂生产汽车零部件为例,A、B两家车厂分别生产不同的轮胎、发动机、制动系统。虽然生产的零件不同,型号不同。但是根本上都有共同的约束,就是轮胎、发动机、制动系统。

    代码实现

    轮胎相关类:

    public interface ITire {
        /**
         * 轮胎 
         */
        void tire();
    }
    
    public class NormalTire implements ITire{
        @Override
        public void tire() {
            System.out.println("普通轮胎");
        }
    }
    
    public class SUVTire implements ITire{
        @Override
        public void tire() {
            System.out.println("越野轮胎");
        }
    }
    

    发动机相关类:

    public interface IEngine {
        /**
         *发动机 
         */
        void engine();
    }
    
    public class DomesticEngine implements IEngine{
        @Override
        public void engine() {
            System.out.println("国产发动机");
        }
    }
    
    public class ImportEngine implements IEngine{
        @Override
        public void engine() {
            System.out.println("进口发动机");
        }
    }
    

    制动系统相关类:

    public interface IBrake {
        /**
         *制动系统 
         */
        void brake();
    }
    
    public class NormalBrake implements IBrake{
        @Override
        public void brake() {
            System.out.println("普通制动");
        }
    }
    
    public class SeniorBrake implements IBrake{
        @Override
        public void brake() {
            System.out.println("高级制动");
        }
    }
    

    抽象车厂类:

    public abstract class CarFactory {
        /**
         * 生产轮胎
         * 
         * @return 轮胎
         * */
        public abstract ITire createTire();
    
        /**
         * 生产发动机
         * 
         * @return 发动机
         * */
        public abstract IEngine createEngine();
    
        /**
         * 生产制动系统
         * 
         * @return 制动系统
         * */
        public abstract IBrake createBrake();
    
    }
    

    A车厂:

    public class AFactory extends CarFactory{
    
        @Override
        public ITire createTire() {
            return new NormalTire();
        }
    
        @Override
        public IEngine createEngine() {
            return new DomesticEngine();
        }
    
        @Override
        public IBrake createBrake() {
            return new NormalBrake();
        }
    }
    

    B车厂:

    public class BFactory extends CarFactory{
    
        @Override
        public ITire createTire() {
            return new SUVTire();
        }
    
        @Override
        public IEngine createEngine() {
            return new ImportEngine();
        }
    
        @Override
        public IBrake createBrake() {
            return new SeniorBrake();
        }
    }
    

    客户端:

    public class Client {
        public static void main(String[] args) {
            //A车厂
            CarFactory factoryA = new AFactory();
            factoryA.createTire().tire();
            factoryA.createEngine().engine();
            factoryA.createBrake().brake();
            System.out.println("---------------");
            //B车厂
            CarFactory factoryB = new BFactory();
            factoryB.createTire().tire();
            factoryB.createEngine().engine();
            factoryB.createBrake().brake();
        }
    }
    

    根据代码实现来理解抽象模式的定义:

    • "为创建一组相关或者是相互依赖的对象提供一个接口" ,一组相关对象是NormalTire、SUVTire,提供一个接口是ITire;"而不需要指定它们的具体实现类"是在客户端使用NormalTire和SUVTire这些类时,不要知道它们是谁。

    总结

    抽象工厂模式和工厂方法模式区别:
    抽象工厂模式相对于工厂方法模式来说,抽象工厂模式每个具体工厂可以生产一族产品(即多种产品);而工厂方法模式每个具体工厂只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。

    缺点:

    1. 每增加一个具体工厂类,并且产品类型有不同,会导致类文件的成倍增加;
    2. 不太容易扩展新的产品类,因为我们增加一个产品类就需要修改抽象工厂,那么所有的具体工厂类均会被修改。

    相关文章

      网友评论

          本文标题:设计模式之抽象工厂模式

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