/** * The Creator class declares the factory method that is supposed to return an * object of a Product class. The Creator's subclasses usually provide the * implementation of this method. */ abstractclassCreator { /** * Note that the Creator may also provide some default implementation of the * factory method. */ publicabstractfactoryMethod(): Product;
/** * Also note that, despite its name, the Creator's primary responsibility is * not creating products. Usually, it contains some core business logic that * relies on Product objects, returned by the factory method. Subclasses can * indirectly change that business logic by overriding the factory method * and returning a different type of product from it. */ publicsomeOperation(): string { // Call the factory method to create a Product object. const product = this.factoryMethod(); // Now, use the product. return`Creator: The same creator's code has just worked with ${product.operation()}`; } }
/** * Concrete Creators override the factory method in order to change the * resulting product's type. */ classConcreteCreator1extendsCreator { /** * Note that the signature of the method still uses the abstract product * type, even though the concrete product is actually returned from the * method. This way the Creator can stay independent of concrete product * classes. */ publicfactoryMethod(): Product { returnnewConcreteProduct1(); } }
/** * The Product interface declares the operations that all concrete products must * implement. */ interfaceProduct { operation(): string; }
/** * Concrete Products provide various implementations of the Product interface. */ classConcreteProduct1implementsProduct { publicoperation(): string { return'{Result of the ConcreteProduct1}'; } }
classConcreteProduct2implementsProduct { publicoperation(): string { return'{Result of the ConcreteProduct2}'; } }
/** * The client code works with an instance of a concrete creator, albeit through * its base interface. As long as the client keeps working with the creator via * the base interface, you can pass it any creator's subclass. */ functionclientCode(creator: Creator) { // ... console.log('Client: I\'m not aware of the creator\'s class, but it still works.'); console.log(creator.someOperation()); // ... }
/** * The Application picks a creator's type depending on the configuration or * environment. */ console.log('App: Launched with the ConcreteCreator1.'); clientCode(newConcreteCreator1()); console.log('');
console.log('App: Launched with the ConcreteCreator2.'); clientCode(newConcreteCreator2());
执行结果:
1 2 3 4 5 6 7
App: Launched with the ConcreteCreator1. Client: I'm not aware of the creator's class, but it still works. Creator: The same creator's code has just worked with {Result of the ConcreteProduct1}
App: Launched with the ConcreteCreator2. Client: I'm not aware of the creator's class, but it still works. Creator: The same creator's code has just worked with {Result of the ConcreteProduct2}