• 简单工厂,工厂方法,抽象工厂模式


    软件设计七大原则

    在这里插入图片描述

    一、简单工厂(静态工厂方法)

    它存在的目的很简单:定义一个创建对象的接口。
    
    • 1

    组成:

    工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻		辑。在java中它往往由一个具体类实现。
    抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
    具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    例子

    1.抽象产品角色

    package simpleFactory;
    public interface car {
        void name();
    }
    
    • 1
    • 2
    • 3
    • 4

    2.具体产品角色

    package simpleFactory;
    
    public class tesla implements car{
        @Override
        public void name() {
            System.out.println("特斯拉");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    package simpleFactory;
    
    public class wuLing implements car{
        @Override
        public void name() {
            System.out.println("五菱");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.工厂类角色

    package simpleFactory;
     
    public class carFactory {
        public static car getCar(String car){
            if (car.equals("wuLing")){
                return new wuLing();
            }
            else if (car.equals("tesla")){
                return new tesla();
            }
            else {
                return null;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.顾客测试类

    package simpleFactory;
    public class consumer {
        public static void main(String[] args) {
            car wuLing = carFactory.getCar("wuLing");
            car tesla = carFactory.getCar("tesla");
     
            wuLing.name();
            tesla.name();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    优缺点

    优点

    专门定义一个工厂类负责创建其他类的实例,最大的优点在于工厂类
    中包含了必要的逻辑,根据客户需要的条件动态实例化相关的类。
    
    • 1
    • 2

    优点

    当需要增加一种产品时,比如ProductC就需要修改简单工厂类SimpleFactory(增加if-else块),这违背了开闭原则。
    
    • 1

    二、工厂方法

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
    在这里插入图片描述

    例子

    //创建工厂接口CarFactory:
     
    public interface CarFactory {
        Car createCarFactory();
    }//创建具体类型的工厂:
     
    public class BenzFactory implements CarFactory {
        @Override
        public Car createCarFactory() {
            return new BiyadiCar();
        }
    }public class BiyadiFactory implements CarFactory{
        @Override
        public Car createCarFactory() {
            return new BiyadiCar();
        }
    }public class HongqiFactory implements CarFactory{
        @Override
        public Car createCarFactory() {
            return new HongqiCar();
        }
    }
    ​
    ​
     
    //测试
     
        public static void main(String[] args) {
            HongqiFactory hongqiFactory = new HongqiFactory();
            Car carFactory = hongqiFactory.createCarFactory();
            carFactory.createCar();
        }
    ​
    ​
    ​
    }
    //输出:生产比亚迪
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    结论:用户只需要知道具体工厂的名字,就可以得到想要的产品。
    其满足单一原则,开闭原则,但是灵活性较差。

    三、抽象工厂

    抽象工厂由抽象工厂,具体工厂,抽象产品和具体产品等4个要素构成 
    
    • 1

    抽象工厂各个元素的作用

    1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法
      newProduct(),可以创建多个不同等级的产品。
    2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
    3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
    4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

    结构如下:
    在这里插入图片描述

  • 相关阅读:
    oracle(PLsql)/mysql 建表
    九、Spring Boot 缓存(1)
    Keepalived手动编译安装以及Nginx网关服务器冗余策略
    植物提取树脂HP-286
    51单片机仿真软件 Proteus 8 Pro 安装步骤
    基于ssm框架的大学生社团管理系统
    思腾云计算
    R语言plotly可视化:plotly可视化箱图、并添加抖动数据点jitter(Adding Jittered Points)
    MFC的YUV播放器实现
    如何使用 VuePress 搭建博客网站并 Vercel 部署
  • 原文地址:https://blog.csdn.net/youngbird1998/article/details/127876718