Skip to content
DevMeme
6570 of 7435
PR Review Dread When It's Another Abstract Factory Pattern
CodeReviews Post #7200, on Oct 3, 2025 in TG

PR Review Dread When It's Another Abstract Factory Pattern

Why is this CodeReviews meme funny?

Level 1: Small Request, Huge Project

Imagine your friend asks for a tiny favor: “Hey, can you check my homework answer?” You expect to look at a simple one-line answer. But when you open their notebook, you find they’ve written a whole book with fancy formulas and big words, all just to answer a basic question. You’d probably stare at your friend the same way that orange cat is staring – with a blank, tired face that says, “Really? Was all that really needed?” It’s funny because your friend put way too much effort and complexity into something that should have been simple. The meme is joking about that feeling in the coding world: someone asked for a quick check of their code, but the code had an unnecessarily complicated factory-like setup (kind of like building an entire cookie factory just to bake one batch of cookies). The cat’s expression is basically how we all feel when we see someone doing much more than needed – a mix of surprise and amused disappointment. In simple terms, the picture makes us laugh because it’s a cute way of saying, “Oh no, here we go again with this over-the-top approach.”

Level 2: Over-Engineering 101

Let’s break down what’s happening in this meme in simpler terms. First, a Pull Request (PR) is when a developer proposes some changes to the codebase – it’s like saying, “Hey team, I’ve edited/added some code, can you check it and then merge it into our main project?” A code review is the process where other developers look at that PR and give feedback or approval. It’s meant to catch mistakes, ensure code quality, and share knowledge about the code changes. Often a teammate will casually ask, “Can you review this PR?” expecting a quick thumbs-up.

Now, what did the reviewer find in this case? “Another abstract factory.” To understand why that phrase is said with such dread, you need to know what an Abstract Factory is. In programming, an abstract factory pattern is a fancy design template for how to create objects. Instead of creating objects directly (for example, calling new Cat() to get a Cat), you ask an Abstract Factory to create the object for you. Think of it like going to a restaurant: you (the code) don’t cook the food (create the object) yourself; you place an order to the kitchen (the factory) and they handle the creation, bringing you the finished dish. The “abstract” part means the exact kitchen could be swapped out. Maybe today it’s an Italian restaurant’s kitchen, tomorrow it could be a Chinese restaurant’s kitchen, but you as the customer use the same ordering interface. In coding terms, you might have an interface or abstract class AnimalFactory with a method createAnimal(). Different factories implement this: CatFactory returns cats, DogFactory returns dogs. The rest of your code isn’t aware of which one is used – it just calls createAnimal() and gets an animal. This sounds useful, right? It is – when you actually need that level of flexibility.

The problem (and the joke) arises when such a pattern is used unnecessarily. Over-engineering means designing a solution that's far more complex than the problem calls for. It’s like using a bulldozer to plant a flower seed – effective, maybe, but comically excessive. In software, over-engineering often happens when developers add extra layers “just in case” or because it seems more “proper.” A junior dev might think, “Hey, I learned about design patterns, I should use one here to make my code really solid and extensible!” So they introduce an Abstract Factory for, say, creating a single type of object that likely won’t change or have multiple versions. From a senior dev’s perspective, that’s needless indirection. Why not just create the object directly if you’ll only ever have one kind? By introducing an abstract factory, the code now has more moving parts: an interface, one or more factory classes, etc., all to end up doing the same thing it could before. This adds to what we call technical complexity – more code to understand, maintain, and possibly get wrong.

Now imagine you’re the reviewer (the person checking the code). You open the PR expecting maybe a quick fix or a straightforward implementation, but instead you see dozens of new lines implementing a generalized factory system. You might literally sigh or facepalm. That’s PR review fatigue kicking in – the feeling of “Oh no, now I have to wade through all this and give constructive feedback.” If this isn’t the first time you’ve seen such over-engineered solutions, it can be pretty tiring. Each extra abstraction means you have to mentally trace through more code to figure out how things work. Code reviews can be fun when you learn something new or see a clever but necessary solution. But they become a chore when you keep encountering overuse of design patterns that make the code harder to read for no real gain.

Let’s clarify a bit more about design patterns: These are like known solutions or templates for solving common software design problems. The Abstract Factory pattern we discussed is one of them. Others include the Singleton, Observer, Builder, etc. They’re taught as best practices in certain scenarios. However, knowing when not to use a pattern is just as important as knowing how to use it. An abstract_factory_pattern is great if, for example, you’re writing a game where you want to easily switch between “Fantasy” theme creatures and “Sci-Fi” theme creatures – you’d have a FantasyFactory that creates dragons and elves, and a SciFiFactory that creates aliens and robots, both conforming to the same interface so the game code can treat them interchangeably. But if your game is only ever going to have dragons, making a factory for it is unnecessary. It’s like setting up a whole factory assembly line to create one custom toy – you could have just crafted it by hand with much less effort.

The meme also leverages the cat meme format which is popular in developer humor. The cat image with that blank, tired stare is basically a stand-in for the reviewer’s face. Cats are often used in memes because their expressions can unintentionally look very human in conveying emotion. In this case, the orange cat looks utterly done with the situation – not angry, not confused, just done. Developers share memes like this because even though the situation is frustrating in real life, seeing it represented in a silly way (with a cat, on a Twitter screenshot) makes it easier to laugh about. It’s a form of venting. You’re essentially saying, “Look at this scenario, it’s so ridiculous it’s funny – and hey, I bet many of you have been here too!”

The text ">hey can you review this PR" and ">another abstract factory" is written in a style that mimics someone quoting a conversation line by line. This format, with the > symbol, is common on Twitter or forums to indicate you’re quoting someone (in this case, it’s like the reviewer quoting what they encountered). The first line is the innocent request, and the second is the jaded reaction. Without explicitly saying anything like “I was annoyed,” the phrase “another abstract factory” by itself, especially preceded by that quote symbol, drips with sarcasm in context. It implies that the reviewer has seen so many of these that they just deadpan the words out. For a newer developer or someone not familiar with these inside jokes, that phrasing might be odd. But in dev culture, it’s a concise way to convey, “They asked me to review their code; I opened it and immediately saw, oh great, they added yet another unnecessary abstract factory. Typical.”

So, from a junior perspective, what’s important to take away? Code quality isn’t just about making things extensible or using fancy patterns. It’s often about keeping things as simple as possible while solving the problem. Every extra layer or abstraction has a cost in complexity. Yes, you want your code to be organized and not tightly coupled (those are good principles), but you also don’t want to invent elaborate frameworks inside your app for no reason. That’s why experienced devs sometimes push back in code reviews with comments like, “Do we really need this abstraction here? Could we simplify?” They’re not trying to be dismissive of design patterns – they probably love a good pattern when it truly helps – but they’ve seen the downside of pattern abuse. They’ve spent late nights debugging or refactoring code that was layered like an onion, peeling abstraction after abstraction to find the actual logic. It’s not fun.

The meme is a lighthearted reminder: always match the tool to the task. An Abstract Factory is a tool. If you only need a screwdriver, don’t bring out the whole power drill kit and safety goggles. And if you do, don’t be surprised if your teammate gives you that “seriously?” look – just like our orange cat.

Level 3: Design Pattern Déjà Vu

For seasoned developers, this meme triggers a knowing groan. It perfectly captures that feeling of pull request déjà vu: “Oh no, not another darn abstract factory…” :roll_eyes:. The scenario is painfully relatable – a fellow developer cheerily pings, “hey can you review this PR?”, and you, the code reviewer, open it expecting maybe a few lines changed or a bug fix. Instead, you’re greeted with an entire new AbstractFactory class (or five) woven into the codebase. It’s as if you popped the hood of your trusty car for an oil change and discovered someone installed an entire extra engine you never asked for. CodeReview fatigue sets in immediately. The cat’s expression in the image – blank stare, ears alert but eyes half-lidded with resignation – is basically the embodiment of a senior engineer’s soul at that moment. You can almost hear the internal monologue behind that thousand-yard stare: “Here we go again…”.

Why is this so humorous (and traumatic) from a senior perspective? Because it’s a satire of over-engineering in its purest form. The Abstract Factory pattern is a well-known creational design pattern that, in theory, helps manage complexity by decoupling object creation. But when a codebase accumulates “abstract factory” upon “abstract factory” for every little feature, it becomes a parody of good architecture. The meme’s text ">hey can you review this PR" > "another abstract factory" reads like a tiny one-act play. The first line is the innocent setup, the second line the punchline reveal – the reviewer’s exasperated summary of what they found. No additional commentary needed; those three words “another abstract factory” are said with the same exhausted tone as “not again…”. It’s a shorthand complaint that experienced devs immediately recognize as code for “this PR is over-complicated for no good reason.”

In real-life teams, this happens a lot. A developer, perhaps excited about patterns or trying to write "enterprise-grade" code, submits a change that introduces a brand new Factory-of-Something where a simple function or direct object construction would do. The reviewer has seen this pattern before – literally. Maybe the codebase already has multiple factory classes, and this PR adds yet another layer. It’s design pattern deja vu, and not the fun kind. Each new factory class means new files to slog through, new abstractions to mentally map out. You scroll through the PR diff and see a flurry of interface IFooFactory { ... } and class FancyFooFactory implements IFooFactory { ... } and immediately your brain’s cognitive load spikes. The humor is that this surprise is both irritating and completely unsurprising at the same time. It’s a relatable developer experience: almost every senior dev has a war story of opening a code review and finding over-architected solutions inside.

The cat image choice drives it home. A blank, emotionally drained cat is basically the patron saint of code reviewers encountering overuse_of_design_patterns. It’s not an angry reaction, it’s not a shocked Pikachu face – it’s a weary acceptance. “Of course the junior dev solved it by adding another abstraction… what did I expect?” The cat’s face says, “I’ve seen things, and I am too tired to even pull out my claws.” This is the CodeReviewPainPoints mood: you care about code quality, but reviewing yet another unnecessary factory is just… soul-sapping.

Beyond the emotional beat, there’s a layer of ironic commentary on software development culture. The Abstract Factory pattern itself is not evil – it’s a legitimate solution in many cases (UI toolkits, database driver selection, etc.). But its overuse has become emblematic of architecture astronaut thinking. That’s a term for developers who float in the lofty realm of abstraction, adding layers upon layers far above the concrete needs of the code. Like an astronaut drifting away from Earth, they lose touch with the ground reality of the problem. So when a PR comes in introducing an AbstractSingletonFactoryProxyManager (yes, these absurdly long names exist in the wild), senior devs can’t help but facepalm – or in this case, stare blankly like a jaded cat. The meme pokes fun at how proud such PR authors often are: “Look, I implemented the Abstract Factory pattern to solve our issue!” Meanwhile, the reviewer is thinking, “Great, now to understand this I have to click through five files and two UML diagrams. All for what could have been a one-liner.”

This highlights a classic architectural tradeoff: simplicity vs. extensibility. The PR author likely prioritized a design that’s extensible (in case we need more types down the road), whereas the reviewer values keeping the code simple and readable until that extension is truly needed. The humor is that the extensibility is purely speculative – a tradeoff that might never pay off. It’s like installing an extra steering wheel in your car just in case someone needs to drive from the passenger seat someday. Instead of praise for foresight, the author is getting silent scorn for unnecessary complexity.

There’s also a hint of code review dread here. Checking a PR should be a quick, satisfying process where you see a problem solved or a feature added. But when you stumble on something like a wild Abstract Factory, you dread the next steps: writing up a polite but pointed review comment, bracing for the possible debate (“But this is the proper design pattern for future extensibility!”), and possibly mentoring the author about YAGNI and simpler alternatives. It’s mentally taxing. Over time, if you review enough over-engineered PRs, you develop that thousand-yard stare shown by the cat – a mix of resignation and dark humor to cope.

Ultimately, the meme lands because it exaggerates a truth that many in software teams have lived. It’s funny because it’s true: behind every “LOL” at this post is a memory of a real code review where the reviewer had exactly that reaction. Whether it was another abstract factory, or a needless Singleton, or some template meta-programming acrobatics, the feeling is identical. The cat’s bored face is basically saying, “I’ve been through this too many times to get overtly upset. I’ll just internally scream into the void and then calmly write a review comment.” It’s developer humor at its finest – using a cute cat to soften the very real frustration of code review pain points. And yes, after you finish chuckling, you’ll probably go back to that PR and start unraveling the new factory pattern with a heavy sigh – because somebody’s got to maintain this code, and that somebody is probably you.

// A quick illustration of the kind of over-engineering we're talking about:
interface PetFactory {
    Pet createPet();
}
class CatFactory implements PetFactory {
    public Pet createPet() {
        return new Cat();  // returns a Cat instance
    }
}
// Somewhere in the code, using the factory:
PetFactory factory = new CatFactory();
Pet myPet = factory.createPet();  // we get a Cat, eventually

// The sarcasm: Did we really need a whole factory class just to create a Cat? We could’ve simply done new Cat(). 🙃

Above is a tongue-in-cheek example. The pattern adds an entire interface and class just to instantiate a cat. This is what “another abstract factory” feels like in many cases – overkill. In a real-world scenario, an Abstract Factory might produce more than one type of object (imagine DogFactory, BirdFactory all implementing PetFactory so we can swap what kind of Pet we create). But if your app never actually needs to swap pets – if it’s always going to make Cats – then that extra abstraction is just dead weight. Code reviewers spot this a mile away. It’s a bit comical: developers sometimes apply these patterns out of habit or a desire to follow “best practices,” without asking if the practice fits the problem. The result is code that’s theoretically flexible but practically more complicated for everyone. The meme crystallizes that experience in one blunt phrase and a perfectly apathetic cat face.

Level 4: Gang-of-Four Gospel

In the pantheon of software design patterns, the Abstract Factory holds a venerable spot. First codified in the famous “Gang of Four” book (1994’s Design Patterns: Elements of Reusable Object-Oriented Software), it was practically preached as gospel for organizing code creation logic. The idea is academically elegant: encapsulate the creation of related objects so that the client code is decoupled from specific classes. In theory, this yields flexible systems where you can swap out entire families of objects (say, GUI widgets for Windows vs MacOS) by changing which factory is used. It’s rooted in sound Object-Oriented Design principles – notably the Dependency Inversion Principle (one of the SOLID principles) – where code depends on abstract interfaces rather than concrete implementations. An Abstract Factory provides those interfaces, instantiating the right concrete classes behind the scenes. This pattern can be a boon in complex systems needing loose coupling and variation. It’s the sort of design architecture discussed in university courses and classic papers on reusable object-oriented architecture.

But the gospel of design patterns can turn into dogma. Academically, we recognize a concept called accidental complexity – additional complexity introduced by a solution that goes beyond the inherent complexity of the problem. Every extra layer of abstraction (like an abstract factory) is a potential source of such complexity if it isn’t solving a real problem. In an ideal Platonic form of software, you’d only add an Abstract Factory when you truly have multiple “product families” to swap in and out. However, real-world developers often anticipate future needs that never materialize. This is the YAGNI principle (“You Aren’t Gonna Need It”) being violated on a grand scale: implementing an elaborate factory framework for hypothetical extension points. The result? A proliferation of classes and interfaces that might as well be a Rube Goldberg machine for object creation. Theoretically, more abstraction yields greater flexibility, but there’s a diminishing return – and beyond a point, it’s pure over-engineering.

It doesn’t help that the GoF patterns were formulated in an era of languages less expressive than some we have now. Early Java and C++ didn’t have convenient features like lambdas, first-class functions, or powerful reflection APIs. Many design patterns (Abstract Factory included) were workarounds for language limitations. In fact, it’s been wryly observed by experts that a majority of GoF patterns “disappear” or become one-liners in more dynamic or functional languages. For example, a Python or JavaScript developer could achieve the same flexibility as an abstract factory by simply passing around a factory function (or using a dictionary of constructor functions) – no class hierarchies required. This academic insight highlights why blindly following the Gang-of-Four gospel in modern contexts can be misguided. Today’s languages often provide direct features for problems that patterns used to solve indirectly.

All this theory sets the stage for the humor in the meme. The developer who added “another abstract factory” likely believed they were doing the right architectural thing – following best practices as taught by textbooks and gurus. On paper, an Abstract Factory is a sound design for certain scenarios. But when applied without true necessity, it succumbs to what one might call architecture astronautics – going so high-level and abstract that you lose sight of the ground-level simplicity. The meme underscores the cognitive dissonance between the idealized design pattern world and the pragmatic code reality. In theory, each pattern, each abstract class, each factory is a virtuous addition improving decoupling; in practice, too many layers make a senior engineer’s head spin. It’s a textbook example of how architectural trade-offs can veer into overuse of design patterns, creating a codebase where navigating the class hierarchy feels like solving a maze. The Abstract Factory Pattern, in all its theoretical glory, becomes less a useful tool and more an inside joke – a symbol of needless complexity that weary engineers recognize all too well.

Description

A tweet by Joel (@ptr_to_joel) showing text: '"hey can you review this PR" >another abstract factory'. Below is a close-up photo of an orange tabby cat with a tired, resigned, and slightly pained expression, perfectly capturing the feeling of being asked to review yet another PR full of overengineered design patterns. The cat's weary eyes convey the exhaustion of dealing with pattern-obsessed developers

Comments

18
Anonymous ★ Top Pick The Abstract Factory pattern: for when you need a factory to create a factory that creates the thing you actually wanted to build three sprints ago. Somewhere, a Gang of Four author sheds a single tear
  1. Anonymous ★ Top Pick

    The Abstract Factory pattern: for when you need a factory to create a factory that creates the thing you actually wanted to build three sprints ago. Somewhere, a Gang of Four author sheds a single tear

  2. Anonymous

    That feeling when the PR is just instantiating a new object, but it's wrapped in a `WidgetFactoryFactory.getInstance().createWidgetFactory(WidgetType.SIMPLE).createWidget()`

  3. Anonymous

    At this stage, our sprint velocity is measured in how many new factories we can abstract rather than how many features we deliver

  4. Anonymous

    After 15 years in the industry, you realize the Abstract Factory pattern in most PRs is just a elaborate way to avoid writing 'new' directly - because apparently instantiating objects without three layers of indirection means you haven't read enough Martin Fowler

  5. Anonymous

    When your junior dev discovers the Gang of Four book and suddenly every PR needs three layers of factories, two builders, and a singleton 'just in case we need to scale.' Meanwhile, you're sitting there like this cat, knowing full well that `new MyClass()` would've sufficed, but now you have to gently explain why AbstractFactoryFactoryProvider might be slightly overkill for a configuration object

  6. Anonymous

    Our DI container now instantiates more factories than users; the only concrete implementation left is my exhaustion

  7. Anonymous

    At this rate we’ll need an AbstractReviewerFactory just to instantiate someone with enough context to untangle all the indirection

  8. Anonymous

    Abstract Factory PRs: where one layer of indirection becomes a factory churning out infinite indirections, until the concrete classes cry for mercy

  9. @mrYakov 9mo

    how about implementing custom dsl to shorten if statement on two symbols ?

  10. @CCZeroOne 9mo

    and, like, is that a bad thing?

    1. @deadgnom32 9mo

      yes. it means it's in Java

      1. @TheFloofyFloof 9mo

        At least its not C

        1. @deadgnom32 9mo

          why? C is nice and simple.

          1. @Art3m_1502 9mo

            Until someone makes array of void pointers

            1. @azizhakberdiev 9mo

              I cast any two structs with same size will be treated as same

              1. _ 9mo

                Well that's debatable, but thankfully not many programms have to run on DS9K

  11. @NaNmber 9mo

    I'm a webdev kid, but our backend is in java. I'd delaying it as much as possible, but I'm afraid at some point I'd have to get into it. Looks scarily huge ngl.

    1. @Algoinde 9mo

      run

Use J and K for navigation