2.工厂模式

简单工厂模式

角色 介绍
抽象产品 产品规范,定义了产品的主要特性和功能
具体产品 实现或者继承抽象产品的子类
具体工厂 提供了创建产品的方法,使用者通过该方法获取产品
abstract class Coffee {}
class CoffeeA extends Coffee {}
class CoffeeB extends Coffee {}

public class EasyFactory {
    public Coffee createCoffee(String type) {
        Coffee coffee = null;
        if ("coffeeA".equals(type)) {
            coffee = new CoffeeA();
        } else if ("coffeeB".equals(type)) {
            coffee = new CoffeeB();
        }
        return coffee;
    }
}
简单工厂模式
优点 后期如果需要对象直接从工厂中获取即可
缺点 后期如果再添加新的类,就必须修改工厂的代码,违反了开闭原则

工厂方法模式

介绍 内容
抽象工厂 创建产品的接口
具体工厂 完成具体产品的创建
抽象产品 定义了产品的规范,描述了产品的主要特性和功能
具体产品 实现抽象产品所定义的接口,由具体工厂来创建
说明
优点 不需要修改工厂类的代码了
缺点 要相应的一直增加工厂类
abstract class Fruit {}
class Apple extends Fruit {}
class Orange extends Fruit {}

interface Factory {
    Fruit makeFruit();
}
class FactoryMethodA implements Factory {
    @Override
    public Fruit makeFruit() {
        return new Apple();
    }
}
class FactoryMethodB implements Factory {
    @Override
    public Fruit makeFruit() {
        return new Orange();
    }
}

抽象工厂模式

产品族:

  • 左边部分,这部分的东东都是属于同一个产品族的,里面包含有外套、领带、衬衫、西裤、皮鞋等等这些产品,很明显能感受到这个产品族是属于商务风格的。
  • 右边部分,这部分的东东同样属于同一个产品族,里面包含有运动上衣、毛衫、运动裤子、运动鞋等等这些产品,看得出来这个产品族是属于运动风格的。

产品级别:

  • 如何去体现同级别的产品呢?同种类的产品就是同级别的产品。
  • 商务风的上衣是上衣,运动风的上衣它也是上衣,所以它们属于同级别的产品。
  • 再比如鞋子,皮鞋和运动鞋就属于不同产品族里面的同种类产品。
说明
优点 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
这是什么意思呢?我给大家简单的去解释一下,就拿以上案例来说,意大利风味的甜点工厂它只生产拿铁咖啡和提拉米苏这样的产品,你如果没有去创建其它的工厂对象的话,那么你就只能点这俩产品,这保证了它俩的一个搭配。如果后期你想换口味了,想点拿铁咖啡和抹茶慕斯,那么对不起,做不到!那么问题是不是就随之产生了啊!
缺点 当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。这是什么意思呢?还是拿以上案例来说,现在生产的有两类产品,一类是甜点,一类是咖啡,这时如果我们再添加一类产品,即汉堡,那么你会发现所有的工厂类(包括抽象工厂和具体工厂)的代码都需要进行修改,因为我们需要再加一个方法,即生产汉堡的方法。
abstract class Color {}
class Black extends Color {}
class Write extends Color {}

abstract class Animal {}
class Tigger extends Animal {}
class Cat extends Animal {}

interface AbsFac {
    Color createBlack();
    Animal createWrite();
}
class AbstractFactoryA implements AbsFac {
    @Override
    public Color createBlack() {
        return new Black();
    }

    @Override
    public Animal createWrite() {
        return new Tigger();
    }
}
class AbstractFactoryB implements AbsFac {
    @Override
    public Color createBlack() {
        return new Write();
    }

    @Override
    public Animal createWrite() {
        return new Cat();
    }
}
posted @ 2023-08-16 17:21  jsqup  阅读(2)  评论(0编辑  收藏  举报