It is a design pattern that creates objects using a generic method or class, allowing you to produce different types of objects without specifying their exact classes upfront.
Click to reveal answer
beginner
How does a generic factory improve code reusability?
By using generics, the factory can create many types of objects with one method or class, reducing repeated code and making it easier to add new types later.
Click to reveal answer
intermediate
TypeScript syntax: How do you declare a generic factory function?
You use angle brackets with a type parameter, like <T>, before the function parameters. Example:
function createInstance<T>(c: new () => T): T { return new c(); }
Click to reveal answer
intermediate
What role does the 'new () => T' type play in a generic factory?
It tells TypeScript that the argument is a constructor function that can create an instance of type T without any parameters.
Click to reveal answer
beginner
Why use a generic factory instead of creating objects directly?
It separates object creation from usage, making code easier to maintain and extend. You can create new types without changing the factory logic.
Click to reveal answer
What does the generic type parameter <T> represent in a generic factory?
AThe type of object the factory will create
BThe name of the factory function
CA fixed class type
DThe return type of the factory function
✗ Incorrect
The generic type represents the type of object the factory will create, allowing flexibility.
In TypeScript, what does 'new () => T' mean in a factory function parameter?
AA variable of type T
BA function that returns a string
CA constructor that takes no arguments and returns type T
DA generic type constraint
✗ Incorrect
'new () => T' means a constructor function that takes no arguments and returns an instance of type T.
Which benefit does a generic factory pattern provide?
ARemoves the need for classes
BMakes code slower
CRequires hardcoding all object types
DAllows creating multiple object types with one factory
✗ Incorrect
Generic factories allow creating many object types with one reusable factory method.
What is a key advantage of separating object creation using a factory?
AEasier to change object creation without affecting usage
BObjects become immutable
CCode becomes more complex
DYou must write more code
✗ Incorrect
Separating creation makes it easier to update or extend object creation without changing the rest of the code.
How do you call a generic factory function to create an instance of class Car?
ACar.createInstance()
BcreateInstance<Car>(Car)
Cnew createInstance<Car>()
DcreateInstance()
✗ Incorrect
You pass the class Car as an argument and specify the generic type: createInstance(Car).
Explain how a generic factory pattern works in TypeScript and why it is useful.
Think about how one function can create many types of objects.
You got /5 concepts.
Describe the TypeScript syntax needed to define a generic factory function that creates instances of any class.
Focus on the function signature and how it uses the constructor.
You got /4 concepts.
Practice
(1/5)
1.
What is the main purpose of the Generic factory pattern in TypeScript?
easy
A. To enforce strict typing on all variables.
B. To create objects without specifying their exact class.
C. To handle asynchronous operations automatically.
D. To optimize code for faster execution.
Solution
Step 1: Understand the pattern's goal
The generic factory pattern is designed to create objects without needing to know their exact class ahead of time.
Step 2: Compare options with the pattern's purpose
To create objects without specifying their exact class. correctly states this purpose. Other options describe unrelated features.
Final Answer:
To create objects without specifying their exact class. -> Option B
Hint: Focus on object creation without class details [OK]
Common Mistakes:
Confusing with async handling
Thinking it enforces variable typing
Assuming it optimizes runtime speed
2.
Which of the following is the correct syntax to declare a generic factory function in TypeScript?
function create<T>(): T { /* ... */ }
easy
A. function create<T>(): T { return new T(); }
B. function create<T>(): T { return T(); }
C. function create<T>(): T { return new Object(); }
D. function create<T>(): T { return {} as T; }
Solution
Step 1: Analyze generic function syntax
The function declares a generic type T and returns an object of type T.
Step 2: Check return statements for correctness
function create<T>(): T { return {} as T; } uses a type assertion {} as T which is valid to create a generic placeholder object. function create<T>(): T { return new T(); } tries to use new T() which is invalid because T is a type parameter, not a constructor. function create<T>(): T { return T(); } calls T() like a function which is invalid. function create<T>(): T { return new Object(); } returns a generic object but not typed as T.
Final Answer:
function create<T>(): T { return {} as T; } -> Option D
Quick Check:
Generic factory syntax = use type assertion [OK]
Hint: Use type assertion to return generic type instance [OK]
Common Mistakes:
Trying to instantiate generic type with new
Calling generic type as a function
Returning untyped objects without assertion
3.
What will be the output of this TypeScript code using a generic factory pattern?
interface Animal { speak(): string; }
class Dog implements Animal { speak() { return "Woof"; } }
function createAnimal<T extends Animal>(ctor: new () => T): T {
return new ctor();
}
const dog = createAnimal(Dog);
console.log(dog.speak());
medium
A. "Woof"
B. undefined
C. TypeError at runtime
D. Compilation error
Solution
Step 1: Understand the factory function behavior
The function createAnimal takes a constructor ctor and returns a new instance of type T which extends Animal.
Step 2: Trace the code execution
We pass Dog class to createAnimal, so it returns a new Dog instance. Calling dog.speak() returns "Woof".
Hint: Trace constructor call and method output [OK]
Common Mistakes:
Assuming generic type can't be instantiated
Confusing type constraints with runtime errors
Expecting undefined instead of method return
4.
Identify the error in this generic factory function and select the fix.
function createInstance<T>(): T {
return new T();
}
medium
A. Add a constructor parameter: ctor: new () => T and return new ctor().
B. Remove new keyword and call T() directly.
C. Change return type to any to avoid errors.
D. Use Object.create(T) instead of new T().
Solution
Step 1: Identify why new T() causes error
TypeScript does not allow new T() because T is a type parameter, not a constructor function.
Step 2: Apply correct fix using constructor parameter
Passing a constructor function ctor: new () => T allows calling new ctor() to create an instance of T.
Final Answer:
Add a constructor parameter: ctor: new () => T and return new ctor(). -> Option A
Quick Check:
Generic factory needs constructor parameter [OK]
Hint: Pass constructor as parameter to instantiate generic type [OK]
Common Mistakes:
Trying to instantiate generic type directly
Removing new keyword incorrectly
Changing return type to any loses type safety
5.
You want to create a generic factory that can produce different shapes with a draw() method. Which approach correctly uses the generic factory pattern to support adding new shapes easily?
interface Shape { draw(): void; }
class Circle implements Shape { draw() { console.log("Circle"); } }
class Square implements Shape { draw() { console.log("Square"); } }
// What is the best factory implementation?
hard
A. function createShape<T>(): T { return {} as T; }
B. function createShape(): Shape { return new Circle(); }
C. function createShape(ctor: new () => T): T { return new ctor(); }
D. function createShape(type: string): Shape { if(type === 'circle') return new Circle(); else return new Square(); }
Solution
Step 1: Understand the requirement for flexibility
The factory should create any shape implementing Shape without hardcoding types.
Step 2: Evaluate each option
function createShape(ctor: new () => T): T { return new ctor(); } uses a generic constructor parameter allowing easy addition of new shapes. function createShape(): Shape { return new Circle(); } always returns Circle, no flexibility. function createShape(type: string): Shape { if(type === 'circle') return new Circle(); else return new Square(); } uses string checks, less type-safe and harder to extend. function createShape<T>(): T { return {} as T; } returns an empty object cast to T, which is unsafe.
Final Answer:
function createShape<T extends Shape>(ctor: new () => T): T { return new ctor(); } -> Option C
Quick Check:
Generic factory with constructor param = flexible shape creation [OK]
Hint: Use generic constructor param for flexible object creation [OK]
Common Mistakes:
Hardcoding return types limits extensibility
Using string type checks reduces type safety
Casting empty objects loses real behavior
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.