zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    一、抽象工厂模式介绍

    1、定义与类型

    定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类
    类型:创建型

    2、使用场景

    客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
    强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
    提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

    3、优点

    具体产品在应用层代码隔离,无须关心创建细节
    将一个系列的产品族统一到一起创建

    4、缺点

    规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
    增加了系统的抽象性和理解难度

    5、产品等级结构与产品族

    规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
    增加了系统的抽象性和理解难度

    产品族可理解为厂家,例如美的、海尔、三星、海信
    产品等级结构可理解为特定的产品类型,例如空凋、冰箱、洗衣机

    美的可以生产 美的空调、美的冰箱、美的洗衣机 ,
    海尔可以生产 海尔冰箱、海尔冰箱、海尔洗衣机 。以此类推

    抽象工厂里的方法,经常以工厂方法的方式来实现,工厂方法关注产品等级结构,抽象方法关注产品族。

    二、 代码示例

    抽象产品视频类:

    public abstract class Video {
        public abstract void produce();
    }
    

    实现产品视频类1:

    public class PythonVideo extends Video {
        @Override
        public void produce() {
            System.out.println("录制Python课程视频");
        }
    }
    

    实现产品视频类2:

    public class JavaVideo extends Video {
        @Override
        public void produce() {
            System.out.println("录制Java课程视频");
        }
    }
    

    抽象产品手记类:

    public abstract class Article {
        public abstract void produce();
    }
    

    实现产品手记类1:

    public class PythonArticle extends Article {
        @Override
        public void produce() {
            System.out.println("编写Python课程手记");
        }
    }
    

    实现产品手记类2:

    public class JavaArticle extends Article {
        @Override
        public void produce() {
            System.out.println("编写Java课程手记");
        }
    }
    

    抽象工厂类 课程工厂:

    public interface CourseFactory {
        Video getVideo();
        Article getArticle();
    }
    

    实现工厂类1:

    public class PythonCourseFactory implements CourseFactory {
        @Override
        public Video getVideo() {
            return new PythonVideo();
        }
        @Override
        public Article getArticle() {
            return new PythonArticle();
        }
    }
    

    实现工厂类2:

    public class JavaCourseFactory implements CourseFactory {
        @Override
        public Video getVideo() {
            return new JavaVideo();
        }
        @Override
        public Article getArticle() {
            return new JavaArticle();
        }
    }
    

    测试类:

    public class Test {
        public static void main(String[] args) {
            CourseFactory courseFactory = new JavaCourseFactory();
            Video video = courseFactory.getVideo();
            Article article = courseFactory.getArticle();
            video.produce();
            article.produce();
        }
    }
    

    类图:

    Test应用层代码与产品类 是解耦的,依赖关系越少,耦合层次越低;只和产品族的工厂发生依赖。
    创建工厂的时候,尽量找固定程度比较高。

    三、源码示例

    1、JDBC中的Connection:

    返回同一种产品族,产品等级可能是Mysql、Oracle、SqlServer等

  • 相关阅读:
    【POJ】1287 Networking
    【POJ】1251 Jungle Roads
    【POJ】1182 食物链
    【POJ】2492 A Bug's Life
    【HDUOJ】1213 How many tables
    【POJ】1611 The Suspects
    【POJ】2236 Wireless Network
    【POJ】2240 Arbitrage
    【POJ】3660 Cow Contest
    【POJ】1502 MPI Maelstrom
  • 原文地址:https://www.cnblogs.com/weixk/p/12873955.html
Copyright © 2011-2022 走看看