简单工厂模式
角色 |
介绍 |
抽象产品 |
产品规范,定义了产品的主要特性和功能 |
具体产品 |
实现或者继承抽象产品的子类 |
具体工厂 |
提供了创建产品的方法,使用者通过该方法获取产品 |
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();
}
}
抽象工厂模式
![](https://img2023.cnblogs.com/blog/2487693/202308/2487693-20230816170019107-779853110.png)
产品族:
- 左边部分,这部分的东东都是属于同一个产品族的,里面包含有外套、领带、衬衫、西裤、皮鞋等等这些产品,很明显能感受到这个产品族是属于商务风格的。
- 右边部分,这部分的东东同样属于同一个产品族,里面包含有运动上衣、毛衫、运动裤子、运动鞋等等这些产品,看得出来这个产品族是属于运动风格的。
产品级别:
- 如何去体现同级别的产品呢?同种类的产品就是同级别的产品。
- 商务风的上衣是上衣,运动风的上衣它也是上衣,所以它们属于同级别的产品。
- 再比如鞋子,皮鞋和运动鞋就属于不同产品族里面的同种类产品。
|
说明 |
优点 |
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。 这是什么意思呢?我给大家简单的去解释一下,就拿以上案例来说,意大利风味的甜点工厂它只生产拿铁咖啡和提拉米苏这样的产品,你如果没有去创建其它的工厂对象的话,那么你就只能点这俩产品,这保证了它俩的一个搭配。如果后期你想换口味了,想点拿铁咖啡和抹茶慕斯,那么对不起,做不到!那么问题是不是就随之产生了啊! |
缺点 |
当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。这是什么意思呢?还是拿以上案例来说,现在生产的有两类产品,一类是甜点,一类是咖啡,这时如果我们再添加一类产品,即汉堡,那么你会发现所有的工厂类(包括抽象工厂和具体工厂)的代码都需要进行修改,因为我们需要再加一个方法,即生产汉堡的方法。 |
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();
}
}