zoukankan      html  css  js  c++  java
  • 创造型模式-抽象工厂

    抽象工厂:相比工厂方法模式抽象层次更高,这就意味这抽象工厂返回一组类的工厂。与工厂模式类似,此方法会返回一个工厂,而这个工厂会返回多个子类总的一个,简单来说,抽象工厂是一个工厂对象,该对象又会返回工厂中的一个。简单说,抽象工厂是一个工厂对象,该对象又会返回工厂中的一个


    • 抽象工厂:声明一个用于完成抽象产品对象创建操作的接口。
    • 具体工厂:实现创建具体产品对象的操作。
    • 抽象产品:声明一个用于一类产品对象的接口。
    • 具体产品:定义由相应的具体过程来创建的产品的对象。
    • 客户端:使用由抽象工厂和抽象产品类声明的唯一借口。

    抽象工厂模式应用方法:通过一个示例帮助我们理解一下抽象工厂。假设我们需要一辆车各部分的规格。汽车不同的零件包括车轮,后视镜,引擎和车身;不同品牌的汽车(产品类)是奔驰,宝马,通用汽车。

    【基类】

    package create.abstracfactory;
    
    /**
     * 基类
     * Created by admin on 2018/11/26.
     */
    public abstract class Car {
    
        public abstract Parts getWheels();
        public abstract Parts getMirrors();
        public abstract Parts getEngine();
        public abstract Parts getBody();
    
    
    }

    【奔驰】

    package create.abstracfactory;
    
    /**
     * Created by admin on 2018/11/26.
     */
    public class BenQ extends Car {
    
        @Override
        public Parts getWheels() {
            return new Parts("BenQ_Wheels");
        }
    
        @Override
        public Parts getMirrors() {
            return new Parts("BenQ_Mirrors");
        }
    
        @Override
        public Parts getEngine() {
            return new Parts("BenQ_Engine");
        }
    
        @Override
        public Parts getBody() {
            return new Parts("BenQ_Body");
        }
    }

    【宝马】

    package create.abstracfactory;
    
    /**
     * Created by admin on 2018/11/26.
     */
    public class BMW extends Car {
    
        @Override
        public Parts getWheels() {
            return new Parts("BMW_Wheels");
        }
    
        @Override
        public Parts getMirrors() {
            return new Parts("BMW_Mirrors");
        }
    
        @Override
        public Parts getEngine() {
            return new Parts("BMW_Engine");
        }
    
        @Override
        public Parts getBody() {
            return new Parts("BMW_Body");
        }
    }

    【通用车】

    package create.abstracfactory;
    
    /**
     * Created by admin on 2018/11/26.
     */
    public class GeneralMotos extends Car {
    
        @Override
        public Parts getWheels() {
            return new Parts("GeneralMotos_Wheels");
        }
    
        @Override
        public Parts getMirrors() {
            return new Parts("GeneralMotos_Mirrors");
        }
    
        @Override
        public Parts getEngine() {
            return new Parts("GeneralMotos_Engine");
        }
    
        @Override
        public Parts getBody() {
            return new Parts("GeneralMotos_Body");
        }
    
    }

    【Parts类】

    package create.abstracfactory;
    
    /**
     * Parts的规格会因为不同品牌的汽车而不同
     * Created by admin on 2018/11/26.
     */
    public class Parts {
    
        public String specification;
    
        public Parts(String spec){
            specification = spec;
        }
    
        public String getSpecification(){
            return specification;
        }
    
    }

    【测试类】

    package create.abstracfactory;
    
    /**
     * Created by admin on 2018/11/26.
     */
    public class CarType {
    
        private Car car;
    
        public Car getCar(String carType){
            if ("BenQ".equals(carType)) {
                car = new BenQ();
            } else if ("BMW".equals(carType)) {
                car = new BMW();
            } else if ("GeneralMotors".equals(carType)) {
                car = new GeneralMotos();
            }
            return car;
        }
    
        public static void main(String[] args) {
            CarType carType = new CarType();
            Car car = carType.getCar("BenQ");
            System.out.println("Wheels: "+car.getWheels().getSpecification());
            System.out.println("Mirrors: "+car.getMirrors().getSpecification());
            System.out.println("Engine: "+car.getEngine().getSpecification());
            System.out.println("Body: "+car.getBody().getSpecification());
        }
    
    }

    抽象工厂模式应用场景

    抽象工厂模式的主要优点之一就是屏蔽具体类的创建类的方法,实际应用的类名称不需要再让客户端知道,由于具体类是屏蔽的,因此我们可以在不同的工厂之间切换。

  • 相关阅读:
    数据库事务的4种隔离级别
    线程竞争与同步
    flex 1与flex auto
    React环境搭建
    vue与mapbox
    前端-URL到页面显示的全过程
    监听滚动事件
    点击上下箭头,页码发生改变
    鼠标滑过元素,div显示,并根据scrollTop向下移动
    KB/MB/GB。。单位换算
  • 原文地址:https://www.cnblogs.com/airycode/p/10020940.html
Copyright © 2011-2022 走看看