Padrões criacionais 공장
오늘 배운 내용 2022년 5월 11일
Factory
Propósito
Problema
Solução
Estrutura
Implementação
Referencias
공장
프로포지토
Fornecer uma interface para criar objetos em uma superclasse, mas permitir que as subclasses alterem o tipo de objetos que serão criados
문제a
Se você tem um código muito acoplado a uma á uma classe em especifico, caso um dia exact adicionar uma outra classe vai ter problemas, por exemplo, uma empresa de logistica que usa somente caminhões, e o sistema está fortemente acoplado a classe de caminhão, caso algum dia queira ser implementada a classe navio
isso vai gerar uma refatoração gigantesca no código
솔루션
O padrão factory sugere substituir as chamadas diretas de construção de objetos, nesse caso caminhão para um método factory e ai esse factory vai ficar responsavel por criar e retornar os objetos que nesse caso chamamos de produtos
Nesse exemplo do site refactoring guru, podemos ver que temos uma classeLogistics
que contem um métodocreateTransport
que é uma factory, as classesRoadLogistics
eSeaLogistics
implementam essa classe Logistics e modificam ocreateTransport
para retornar um caminhão e um návio 리스펙티바멘테
제한 사항은 하위 클래스로 존재하며 제품마다 다른 종류의 반환 유형이 있으며 인터페이스와 인터페이스를 구현합니다. Isso ajuda para que quando o cliente faça uma chamada ele apenas precisa saber qual a interface desses produtos e pode tratar todos da mesma forma pois ele sabe que todos vão ter os mesmos métodos
에스트루투라
(Apesar do nome a principal responsabilidade da classe creator não é criar produtos)
구현
abstract class Creator {
public abstract factoryMethod(): Product;
public someOperation(): string {
const product = this.factoryMethod();
console.log(product.opertation());
}
}
class ConcreteCreator1 extends Creator {
public factoryMethod(): Product {
return new ConcreteProduct1();
}
}
class ConcreteCreator2 extends Creator {
public factoryMethod(): Product {
return new ConcreteProduct2();
}
}
os concrete creators vão extender o Creator e mudar apenas o método factory
interface Product {
operation(): string;
}
class ConcreteProduct1 implements Product {
public operation(): string {
return '{Result of the ConcreteProduct1}';
}
}
class ConcreteProduct2 implements Product {
public operation(): string {
return '{Result of the ConcreteProduct2}';
}
}
function clientCode(creator: Creator) {
console.log(creator.someOperation());
}
a partir dai o
clientCode
precisa apenas receber qualquer classe que extende o creator e ele tem certeza que essa classe vai ter o método someOperation
que pode fazer coisas diferentes como por exemplo o no exemplo do barco e caminhão ambos podem ter o método delivery que funcionam de formas diferentes mas isso não import para oclientCode
참조
Reference
이 문제에 관하여(Padrões criacionais 공장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/yanpiing/padroes-criacionais-factory-2mol텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)