zoukankan      html  css  js  c++  java
  • 设计模式笔记 抽象工厂模式

      工厂方法模式是简单工厂的抽象与扩展,如果单一的产品不能满足设计与需求,是否有其他模式对工厂方法进行再次扩展呢?所以就有了抽象工厂。

    定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

      UML类图如下

      从类图可以看出,产品1和产品2是两个抽象产品,为什么要是抽象的呢?因为它们可能有不同的实现(衍生类A或者B)。这就好比是两个系列的产品了。同样,核心工厂类下也有两个工厂子类用于创建不同类型的产品。

      下面看个例子:现需要生产小汽车(car)和吉普车(jeep),会有不同的生产厂家如宝马和奔驰等。

      首先依旧是产品类,此处有两类产品,小汽车和吉普车。

    public interface Car {
        public void drive();
    }
    public interface Jeep {
        public void drive();
    }
    

      小汽车可能是宝马制造也有可能是奔驰制造,吉普车同理。

    public class BWMCar implements Car {
        public void drive() {
            System.out.println("宝马小汽车在行驶。");
        }
    }
    public class BenzCar implements Car {
        public void drive() {
            System.out.println("奔驰小汽车在行驶。");
        }
    }
    public class BWMJeep implements Jeep {
        public void drive(){
            System.out.println("宝马吉普车在行驶。");
        }
    }
    public class BenzJeep implements Jeep {
        public void drive(){
            System.out.println("奔驰吉普车在行驶。");
        }
    }
    

       然后需要一个车辆的生产产商,用来生产小汽车和吉普车。

    public interface VehicleFactory {
        public Car createCar();
        public Jeep createJeep();
    }
    

       同样,有了宝马和奔驰两家厂商来接单。

    public class BWMFactory implements VehicleFactory {
        public Car createCar() {
            return new BWMCar();
        }
        public Jeep createJeep() {
            return new BWMJeep();
        }
    }
    public class BenzFactory implements VehicleFactory {
        public Car createCar() {
            return new BenzCar();
        }
        public Jeep createJeep() {
            return new BenzJeep();
        }
    }
    

       最后,我们就可以生产车辆了。

    public class POC {
        public static void main(String[] args) {
            VehicleFactory vehicleFactory = new BWMFactory();
            Car car = vehicleFactory.createCar();
            Jeep jeep = vehicleFactory.createJeep();
            car.drive();
            jeep.drive();
    
            vehicleFactory = new BenzFactory();
            car = vehicleFactory.createCar();
            jeep = vehicleFactory.createJeep();
            car.drive();
            jeep.drive();
        }
    }
    

     

      可以看到,客户端调用代码时只需要切换具体的工厂实现类,下面的代码一模一样,但便是使用了另一套产品生产体系了(不同的厂商)。使用抽象工厂的第二个好处在于具体实例创建与客户端分离,客户端通过接口操作实例,产品具体类名也被具体工厂实现分离,不会出现在客户端代码中。

      

  • 相关阅读:
    我很喜欢玩游戏,那么我就适合做游戏程序员吗?
    宁可多花1000元租房,也绝不要去挤半小时地铁
    996 盛行的年代,互联网人如何平衡工作和生活 ?
    互联网公司里都有哪些潜规则?
    那些拼命加班的程序员们,后来都怎么样了?
    MongoDB更需要好的模式设计 及 案例赏析
    MongoDB 提升性能的18原则(开发设计阶段)
    关于MongoDB数据库的日志解析
    实现MongoDB读写分离的“读偏好”介绍
    MongoDB分片 在部署和维护管理 中常见事项的总结
  • 原文地址:https://www.cnblogs.com/adamJin/p/7066548.html
Copyright © 2011-2022 走看看