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();
        }
    }
    

     

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

      

  • 相关阅读:
    ‘Host’ is not allowed to connect to this mysql server
    centos7安装mysql
    further configuration avilable 不见了
    Dynamic Web Module 3.0 requires Java 1.6 or newer
    hadoop启动 datanode的live node为0
    ssh远程访问失败 Centos7
    Linux 下的各种环境安装
    Centos7 安装 python2.7
    安装scala
    Centos7 安装 jdk 1.8
  • 原文地址:https://www.cnblogs.com/adamJin/p/7066548.html
Copyright © 2011-2022 走看看