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 @   jsqup  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示