《设计模式》工厂模式

工厂模式

简单工厂模式(Simple Factory)
工厂方法模式(Factory Method)
抽象工厂模式(Abstract Factory)

简单工厂模式

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存
在的目的很简单:定义一个用于创建对象的接口。
先来看看它的组成:

  1. 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由
    一个具体类实现。

  2. 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽
    象类来实现。

  3. 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

来用类图来清晰的表示下的它们之间的关系

实例

从一个打工厂人开始初步创业!首先开个造汽车工厂 来实现财富自由!

抽象产品角色

package com.factory.simplefactory;
//抽象产品角色
public interface Car {
    public  void  drive();

}

具体产品角色

package com.factory.simplefactory;

/**
 * Bmw
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 14:41
 **/
public class Bmw implements Car{
    @Override
    public void drive() {
        System.out.println("生产宝马");
    }
}

具体产品角色

package com.factory.simplefactory;

/**
 * 具体产品角色
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 14:40
 **/
public class Benz implements Car{
    @Override
    public void drive() {
        System.out.println("生产奔驰");
    }
}

工厂类角色

package com.factory.simplefactory;

/**
 * 工厂角色
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 14:43
 **/
public class Driver  {
    //返回具体产品
    public  static  Car driverCar(String s) throws Exception{
        if("奔驰".equals(s)){
           return new Benz();
        }else if("宝马".equals(s)){
            return new Bmw();
        }else {
            throw  new RuntimeException("未找到这辆车");
        }


    }
}

测试

public static void main(String[] args) {
    try {
        Car bmw = Driver.driverCar("宝马");
        bmw.drive();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
//得到结果  生产宝马

类图描述

在这里插入图片描述
Car: 抽象产品角色

Bmw:具体产品角色

Benz:具体产品角色

Driver: 工厂类角色

简单工厂

工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这

样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分

担。

1.抽象工厂角色**

这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须

实现的接口或者必须继承的父类。在 java 中它由抽象类或者接口来实现。

2.具体工厂角色**:

它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体

产品的对象。

3.抽象产品角色

它是具体产品继承的父类或者是实现的接口。在 java 中一般有抽象类

或者接口来实现。

4.具体产品角色

具体工厂角色所创建的对象就是此角色的实例。在 java 中由具体的类

来实现

实例

​ 看来汽车工厂生意惨淡!在人生低谷的时候,收获意外财富1个亿 !连续中10张彩票,从而投资工厂!上次工厂存在很多问题,在添加其他品牌,导致频繁修改工厂生意惨淡(比如 生产宝马代价太高,我改为五菱宏光,但是五菱宏光赚不多 改为奥迪) !所以再次投资工厂 让工厂更规范!

抽象工厂角色

public interface Driver {
    public Car dirverCar();
}

抽象产品角色

/**
 * 宝马工厂
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 15:03
 **/
public class BmwDriver implements Driver{

    @Override
    public Car dirverCar() {
        return new Benz();
    }
}

抽象产品角色

/**
 * 奔驰工厂
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 15:02
 **/
public class BenzDriver implements Driver{

    @Override
    public Car dirverCar() {
        return new Benz();
    }
}

抽象产品角色

package com.factory.factorymethod;

import com.factory.simplefactory.Car;

/**
 * 奥迪工厂
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/12/07 10:42
 **/
public class AudiDriver implements Driver {


    @Override
    public Car dirverCar() {
        return new Audi();
    }
}

具体产品角色

/**
 * 具体产品角色
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 14:40
 **/
public class Benz implements Car {
    @Override
    public void drive() {
        System.out.println("奔驰生产");
    }
}

具体产品角色

package com.factory.factorymethod;

import com.factory.simplefactory.Car;

/**
 * Bmw
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 14:41
 **/
public class Bmw implements Car {
    @Override
    public void drive() {
        System.out.println("宝马生产");
    }
}

具体产品角色

package com.factory.factorymethod;

import com.factory.simplefactory.Car;

/**
 * 奥迪
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/12/07 10:44
 **/
public class Audi implements Car {
    @Override
    public void drive() {
        System.out.println("生产奥迪");
    }
}

具体产品角色

package com.factory.factorymethod;

import com.factory.simplefactory.Car;

/**
 * 具体产品角色
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 14:40
 **/
public class Benz implements Car {
    @Override
    public void drive() {
        System.out.println("生产奔驰");
    }
}

类图

在这里插入图片描述

抽象工厂

抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且

抽象工厂模式是三个里面最为抽象、最具一般性的。

1.抽象工厂角色

这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须

实现的接口或者必须继承的父类。在 java 中它由抽象类或者接口来实现。

2.具体工厂角色

它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体

产品的对象。在 java 中它由具体的类来实现。

3.抽象产品角色

它是具体产品继承的父类或者是实现的接口。在 java 中一般有抽象类

或者接口来实现。

4.具体产品角色

具体工厂角色所创建的对象就是此角色的实例。在 java 中由具体的类

来实现。

实例

通过上次工厂,果不其然赚不少钱,我要开始从事其他产品!我要开始 造飞机 、轮船 等 所以要工厂也要扩展,

抽象工厂角色

//抽象工厂角色
public interface Driver {
    public Car dirverCar();
    public Aircraft make();
}

具体工厂角色

package com.factory.abstractfactory;

import com.factory.simplefactory.Car;

//保时捷工厂
public class PorscheDriver implements Driver {

    @Override
    public Car dirverCar() {

        return new Porsche();
    }

    @Override
    public Aircraft make() {
        return new PorscheAircaft();
    }
}

具体工厂角色

package com.factory.abstractfactory;

import com.factory.simplefactory.Benz;
import com.factory.simplefactory.Car;

/**
 * 奔驰工厂
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 15:02
 **/
public class BenzDriver implements Driver {

    @Override
    public Car dirverCar() {
        return new Benz();
    }

    @Override
    public Aircraft make() {
        return new BenzAircraft();
    }
}

具体工厂角色

package com.factory.abstractfactory;

import com.factory.simplefactory.Benz;
import com.factory.simplefactory.Car;

/**
 * 宝马工厂
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 15:03
 **/
public class BmwDriver implements Driver  {

    @Override
    public Car dirverCar() {
        return new Benz();
    }

    @Override
    public Aircraft make() {
        return new BenzAircraft();
    }
}

抽象产品角色

package com.factory.abstractfactory;
//抽象产品角色汽车
public interface Car {
    public  void  drive();

}

抽象产品角色

package com.factory.abstractfactory;
//抽象角色飞机
public interface Aircraft {
    void make();
}

具体产品角色

package com.factory.abstractfactory;

import com.factory.simplefactory.Car;

/**
 * 具体产品角色
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 14:40
 **/
public class Benz implements Car {
    @Override
    public void drive() {
        System.out.println("生产奔驰汽车");
    }
}

具体产品角色

package com.factory.abstractfactory;

/**
 * 奔驰飞机
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/12/07 11:50
 **/
public class BenzAircraft implements Aircraft{

    @Override
    public void make() {
        System.out.println("奔驰造飞机");
    }
}

具体产品角色

package com.factory.abstractfactory;

/**
 * 宝马飞机
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/12/07 11:47
 **/
public class BmwAircaft implements Aircraft {
    @Override
    public void make() {
        System.out.println("宝马造飞机");
    }
}

具体产品角色

package com.factory.abstractfactory;

import com.factory.simplefactory.Car;

/**
 * Bmw
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/11/30 14:41
 **/
public class Bmw implements Car {
    @Override
    public void drive() {
        System.out.println("生产宝马汽车");
    }
}

具体产品角色

package com.factory.abstractfactory;

import com.factory.simplefactory.Car;

/**
 * 保时捷
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/12/07 10:30
 **/
public class Porsche implements Car {
    @Override
    public void drive() {
        System.out.println("保时捷生产汽车");
    }
}

具体产品角色

package com.factory.abstractfactory;

/**
 * 飞机
 *
 * @author 蔡德巍
 * @version 1.0
 * @date 2021/12/08 11:18
 **/
public class PorscheAircaft implements Aircraft{
    @Override
    public void make() {
        System.out.println("保时捷造飞机");
    }
}

类图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值