工厂模式

一、 什么是工厂模式:
工厂模式的目的是将创建对象的具体过程屏蔽隔离起来,从而达到更高的灵活性
工厂模式可以分为三类
简单工厂模式(Simple Factory)
工厂方法模式(Factory Method)
抽象工厂模式(Abstract Factory)

三种模式从上到下逐渐抽象,并且更具一般性
简单工厂模式可以堪为工厂模式方法的一种特例 两者归为一类

有如下案例
1.在没有工厂的时代,如果客户需要一款宝马车 那么就需要客户去创建一款宝马车,然后拿来用
2.简单工厂模式: 后来出现了工厂
用户就不用去创建宝马车
由工厂直接创建
想要什么车直接通过工厂创建就行了
3.工厂方法模式: 为了满足客户 宝马车的系列越来越多
一个工厂无法创建所以的宝马系列
于是又单独分出来多个具体的工厂
每个具体工厂创建一种系列
即具体工厂类只能创建一个具体的产品
但是宝马工厂还是个抽象
你要指定某个具体的工厂才能生产车出来
二、简单工厂模式
简单工厂模式的核心是定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离
BMW320 -> Customer
BMW523 -> Customer

public class BMW320 {
public BMW320(){
System.out.println("制造-->BMW320");
}
}

public class BMW523 {
public BMW523(){
System.out.println("制造-->BMW523");
}
}

public class Customer {
public static void main(String[] args) {
BMW320 bmw320 = new BMW320();
BMW523 bmw523 = new BMW523();
}
}

1.简单的工厂模式
Customer -> FactoryBMW -> BMW523 or BMW523 -> BMW
客户提出需求 工厂类角色 抽象产品角色 具体产品角色
什么车 用来创建产品 是具体产品继承的父类 是工厂类所创建的对象
是该模式的核心 或实现的接口 就是此角色的实例
在java中由一个具体类来实现

产品类
abstract class BMW {
public BMW(){}
}

public class BMW320 extends BMW {
public BMW320() {
System.out.println("制造-->BMW320");
}
}
public class BMW523 extends BMW{
public BMW523(){
System.out.println("制造-->BMW523");
}
}
工厂类
public class Factory {
public BMW createBMW(int type) {
switch (type) {

case 320:
return new BMW320();

case 523:
return new BMW523();

default:
break;
}
return null;
}
}
用户类
public class Customer {
public static void main(String[] args) {
Factory factory = new Factory();
BMW bmw320 = factory.createBMW(320);
BMW bmw523 = factory.createBMW(523);
}
}

2.工厂方法模式
抽象工厂 AbstractFactory:
工厂方法模式的核心,
是具体工厂角色必须实现的接口或者必须继承的父类,
在 Java 中它由抽象类或者接口来实现。
具体工厂 Factory:
被应用程序调用以创建具体产品的对象,
含有和具体业务逻辑有关的代码
抽象产品 AbstractProduct:
是具体产品继承的父类或实现的接口,在 Java 中一般由抽象类或者接口来实现。
具体产品 Product:
具体工厂角色所创建的对象就是此角色的实例。

Customer -> AbstractFactory |
↑ | -> createXXX -> Product(具体产品)
(Factory1,Factory2) | ↓
去制造 <- AbstractProduct(抽象产品)

产品类:
abstract class BMW {
public BMW(){}
}
public class BMW320 extends BMW {
public BMW320() {
System.out.println("制造-->BMW320");
}
}
public class BMW523 extends BMW{
public BMW523(){
System.out.println("制造-->BMW523");
}
}
工厂类:
interface FactoryBMW {
BMW createBMW();
}

public class FactoryBMW320 implements FactoryBMW{

@Override
public BMW320 createBMW() {
return new BMW320();
}

}
public class FactoryBMW523 implements FactoryBMW {
@Override
public BMW523 createBMW() {
return new BMW523();
}
}
客户类:
public class Customer {
public static void main(String[] args) {
FactoryBMW320 factoryBMW320 = new FactoryBMW320();
BMW320 bmw320 = factoryBMW320.createBMW();

FactoryBMW523 factoryBMW523 = new FactoryBMW523();
BMW523 bmw523 = factoryBMW523.createBMW();
}
}
3.抽象工厂模式
抽象工厂模式主要用于创建相关对象的家族。
当一个产品族中需要被设计在一起工作时,
通过抽象工厂模式,
能够保证客户端始终只使用同一个产品族中的对象;

产品类://发动机以及型号
public interface Engine {}

public class EngineA implements Engine{
public EngineA(){
System.out.println("制造-->EngineA");
}
}
public class EngineB implements Engine{
public EngineB(){
System.out.println("制造-->EngineB");
}
}


//空调以及型号
public interface Aircondition {}

public class AirconditionA implements Aircondition{
public AirconditionA(){
System.out.println("制造-->AirconditionA");
}
}
public class AirconditionB implements Aircondition{
public AirconditionB(){
System.out.println("制造-->AirconditionB");
}
}
创建工厂类://创建工厂的接口
public interface AbstractFactory {
//制造发动机
public Engine createEngine();
//制造空调
public Aircondition createAircondition();
}

//为宝马320系列生产配件
public class FactoryBMW320 implements AbstractFactory{
@Override
public Engine createEngine() {
return new EngineA();
}
@Override
public Aircondition createAircondition() {
return new AirconditionA();
}
}
//宝马523系列
public class FactoryBMW523 implements AbstractFactory {
@Override
public Engine createEngine() {
return new EngineB();
}
@Override
public Aircondition createAircondition() {
return new AirconditionB();
}
}
客户:
public class Customer {
public static void main(String[] args){
//生产宝马320系列配件
FactoryBMW320 factoryBMW320 = new FactoryBMW320();
factoryBMW320.createEngine();
factoryBMW320.createAircondition();

//生产宝马523系列配件
FactoryBMW523 factoryBMW523 = new FactoryBMW523();
factoryBMW523.createEngine();
factoryBMW523.createAircondition();
}
}

工厂方法模式与抽象工厂模式的区别
1、工厂方法模式与抽象工厂模式的区别在于:

(1)工厂方法只有一个抽象产品类和一个抽象工厂类,
但可以派生出多个具体产品类和具体工厂类,
每个具体工厂类只能创建一个具体产品类的实例。

(2)抽象工厂模式拥有多个抽象产品类(产品族)和一个抽象工厂类,
每个抽象产品类可以派生出多个具体产品类;
抽象工厂类也可以派生出多个具体工厂类,
同时每个具体工厂类可以创建多个具体产品类的实例

posted @ 2023-02-04 16:00  小钰Kira  阅读(79)  评论(0)    收藏  举报