23 Notas sobre o padrão de design O terceiro padrão de fábrica simples, padrão de método de fábrica e padrão de fábrica abstrato (consulte o vídeo Mad God)

contente

padrão de fábrica

Padrão de Fábrica Simples (Padrão de Fábrica Estático) Fábrica Simples

 Método de Fábrica Padrão Método de Fábrica

Padrão abstrato de fábrica

resumo


padrão de fábrica

Função : Realiza a separação entre criador e chamador e nos ajuda a instanciar objetos.

Essência central : instancia objetos com fábricas em vez de novas operações

                  Selecionaremos a classe de implementação e criaremos objetos para gerenciamento e controle unificados, desacoplando assim o chamador de nossa classe de implementação

                  O padrão de fábrica é um padrão de desacoplamento típico

Satisfazer os sete princípios da POO:

                Princípio aberto-fechado

                Princípio de Inversão de Dependência

                Lei de Deméter (pese bem)

Classificação:

        Padrão de fábrica simples: usado para gerar qualquer produto na mesma estrutura hierárquica (para novos produtos adicionados, o código existente precisa ser estendido).

        Padrão de método de fábrica: usado para gerar produtos fixos na mesma estrutura hierárquica (suporta adicionar qualquer produto).

        Abstract Factory Pattern: Crie outras fábricas em torno de uma superfábrica.

Cenários aplicáveis : Como um padrão de criação de classe, o padrão de método de fábrica pode ser usado em qualquer lugar que objetos complexos precisem ser gerados. Uma coisa a notar é que objetos complexos são adequados para usar o padrão de fábrica, enquanto objetos simples, especialmente objetos que podem ser criados apenas por new , não precisam usar o padrão de fábrica. Quando o sistema precisa ter melhor escalabilidade, o modo fábrica pode ser considerado, e diferentes produtos são montados com diferentes fábricas de implementação.

De fato, o Creational Pattern abstrai o processo de instanciação de uma classe e pode separar a criação e uso de objetos em módulos de software .

O padrão criacional fornece ao designer de software o máximo de flexibilidade possível em termos do que criar (O que) , quem cria (Quem) e quando criar (Quando) .

Padrão de Fábrica Simples (Padrão de Fábrica Estático) Fábrica Simples

É criar uma classe de fábrica para criar instâncias de algumas classes que implementam a mesma interface.

As funções no padrão de fábrica simples são: fábrica, produto, cliente. Veja o seguinte exemplo:

Primeiro podemos olhar para o diagrama de classes

 O código de implementação específico é o seguinte:

Criar uma interface de carro

public interface Car {
	public void name();
}

Escreva duas classes de implementação

public class WuLing implements Car{
	@Override
	public void name() {
		System.out.println("五菱宏光"); 
	}
}

public class Tesla implements Car{
	@Override
	public void name() {
		 System.out.println("特斯拉");
	}  
}

Criar uma classe de fábrica

public class CarFactory{
	public static Car getCar(String car) {
		if(car.equals("五菱")) {
			return new WuLing();
		}else if(car.equals("特斯拉")) {
			return new Tesla();
		}else {
			return null;
		}
	}
}

faça um teste

public class Comsumer {
	public static void main(String[] args){
		Car car1 = CarFactory.getCar("五菱");
		Car car2 = CarFactory.getCar("特斯拉");
		car1.name();
		car2.name();
	}
}

O resultado da saída:

 

Não preciso me preocupar com a forma como o carro ficou, só preciso fornecer um nome e tirá-lo da fábrica.

Podemos sentir claramente as desvantagens desse modo. Se agora queremos adicionar uma classe de implementação da interface Car e adicionar um carro Volkswagen, devemos modificar o método getCar() na fábrica, que viola o princípio aberto-fechado. .

Claro, podemos modificar os métodos na classe de fábrica e obter o que precisamos sem precisar inserir parâmetros.

public class CarFactory{
	public static Car getWuLing(){
        return new WuLing();
	}
    public static Car getTesla(){
        return new Tesla();
	}
}

Na verdade, isso não atende às nossas necessidades, ainda precisamos modificar o código, mas ele não será modificado na lógica do código como o método anterior.

Problemas com o padrão de fábrica simples:

                viola o princípio aberto-fechado

                Violando o princípio de distribuição de responsabilidade de alta coesão, toda a lógica de criação é centralizada em uma classe de fábrica

 Método de Fábrica Padrão Método de Fábrica

O padrão de método de fábrica é um desacoplamento adicional do padrão de fábrica simples, que é equivalente a dividir a classe de fábrica simples que seria enorme devido ao código de negócios em classes de fábrica individuais, para que o código não seja acoplado à mesma classe. dentro.

Embora o padrão de método de fábrica e o padrão de fábrica simples criem objetos por meio de fábricas, a maior diferença entre eles é que o padrão de método de fábrica está completamente em conformidade com o " princípio aberto-fechado " do design.

Basta observar o exemplo:

 O código específico é implementado da seguinte forma:

A interface do carro, a classe Tesla e a classe WuLing permanecem inalteradas

Criar interface de fábrica de carros

public interface CarFactory{
    public Car getCar();
}

Crie a classe de implementação TeslaFactory factory class e WuLingFactory da interface de fábrica de automóveis

public class TeslaFactory implements CarFactory{
    @Override
    public Car getCar(){
        return new Tesla();
    }
}

public class WuLingFactory implements CarFactory{
    @Override
    public Car getCar(){
        return new WuLing();
    }
}

teste final

public class Comsumer {
	public static void main(String[] args){
		Car car1 = new WuLingFactory.getCar();
		Car car2 = new TeslaFactory.getCar();
		car1.name();
		car2.name();
	}
}

Como o exemplo dado aqui não envolve o problema de parâmetros, nosso sentimento não é muito óbvio, imagine, e se houver muitos parâmetros na classe Tesla ou classe WuLing? Este método é amigável para os consumidores, não precisamos nos importar como o carro é feito, seu método de fábrica correspondente o instanciará, só precisamos chamar o método na fábrica.

Aqui eu acho que o fluxograma do deus louco pode ser mais claro (adicionar camada)

O padrão de método de fábrica pode ser usado nas seguintes situações:

        Uma classe não conhece a classe dos objetos de que precisa.

        Uma classe especifica qual objeto criar por meio de suas subclasses

vantagem:

        Um chamador que deseja criar um objeto precisa apenas saber seu nome.

        Alta escalabilidade, se você deseja adicionar um produto, basta estender uma classe de fábrica.

        A implementação específica do produto é blindada e o chamador se preocupa apenas com a interface do produto.

deficiência:

        Cada vez que um produto é adicionado, uma classe concreta e uma fábrica de implementação de objetos precisam ser adicionadas, o que dobra o número de classes no sistema, aumenta a complexidade do sistema até certo ponto e também aumenta a dependência das classes concretas do sistema . Isso não é uma coisa boa.

Padrão abstrato de fábrica

O padrão de fábrica abstrato é relativo ao padrão de método de fábrica, ou seja, o padrão de método de fábrica é para uma série de produtos, enquanto o padrão de fábrica abstrato é para várias séries de produtos.

Definição : O padrão de fábrica abstrata fornece uma interface para criar uma série de objetos relacionados ou interdependentes sem especificar suas classes concretas. O padrão de fábrica abstrata é uma fábrica de fábricas

Eu pessoalmente acho que isso significa adicionar outra camada, é claro, esta é apenas a minha opinião pessoal.

Antes de contar o caso, precisamos conhecer os dois conceitos de família de produtos e nível de produto:

Vejamos agora um caso específico:

 

Primeiro crie a interface do telefone e a interface do roteador

//手机产品接口
public interface IPhoneProduct {
	void start();
	void shutdown();
	void callup();
	void sendSMS();
}
//路由器产品接口
public interface IRouterProduct {
	void start();
	void shutdown();
	void openWifi();
	void setting();
}

Em seguida, crie duas classes de implementação de interfaces de celular: celular Xiaomi e celular Huawei

//小米手机
public class XiaoMiPhone implements IPhoneProduct{

	@Override
	public void start() {
		System.out.println("开启小米手机");
	}

	@Override
	public void shutdown() {
		System.out.println("关闭小米手机");
	}

	@Override
	public void callup() {
		System.out.println("小米手机打电话");
		
	}

	@Override
	public void sendSMS() {
		System.out.println("小米手机发短信");
		
	}

}
//华为手机
public class HuaWeiPhone implements IPhoneProduct{

	@Override
	public void start() {
		System.out.println("开启华为手机");
	}

	@Override
	public void shutdown() {
		System.out.println("关闭华为手机");
	}

	@Override
	public void callup() {
		System.out.println("华为手机打电话");
		
	}

	@Override
	public void sendSMS() {
		System.out.println("华为手机发短信");
		
	}

}

Crie classes de implementação para duas interfaces de roteador: roteador Xiaomi e roteador Huawei

//小米路由器
public class XiaoMiRouter implements IRouterProduct {

	@Override
	public void start() {
		System.out.println("启动小米路由器");
	}

	@Override
	public void shutdown() {
		System.out.println("关闭小米路由器");
		
	}

	@Override
	public void openWifi() {
		System.out.println("小米路由器打开WiFi");
	}

	@Override
	public void setting() {
		System.out.println("小米路由器设置");
	}

}
//华为路由器
public class HuaWeiRouter implements IRouterProduct {

	@Override
	public void start() {
		System.out.println("启动华为路由器");
	}

	@Override
	public void shutdown() {
		System.out.println("关闭华为路由器");
		
	}

	@Override
	public void openWifi() {
		System.out.println("华为路由器打开WiFi");
	}

	@Override
	public void setting() {
		System.out.println("华为路由器设置");
	}

}

Escreva uma fábrica de produtos abstratos para fabricar

//抽象产品工厂
public interface IProductFactory {	
	//生产手机
	IPhoneProduct iphoneProduct();
	//生产路由器
	IRouterProduct irouterProduct();
}

Criar uma classe de implementação para uma fábrica de produtos abstrata

//小米工厂
public class XiaoMiFactory implements IProductFactory {

	@Override
	public IPhoneProduct iphoneProduct() {
		return new XiaoMiPhone();
	}

	@Override
	public IRouterProduct irouterProduct() {
		return new XiaoMiRouter();
	}
}
//华为工厂
public class HuaWeiFactory implements IProductFactory {

	@Override
	public IPhoneProduct iphoneProduct() {
		return new HuaWeiPhone();
	}

	@Override
	public IRouterProduct irouterProduct() {
		return new HuaWeiRouter();
	}

}

Escreva um teste de cliente:

public class Client {
	public static void main(String[] args) {
		System.out.println("**********华为系列***********");
		//华为工厂
		HuaWeiFactory huaweiFactory = new HuaWeiFactory();
		IPhoneProduct huaweiPhone = huaweiFactory.iphoneProduct();
		huaweiPhone.start();
		huaweiPhone.callup();
	}
}

resultado da operação:

Cenários aplicáveis: O cliente (camada de aplicativo) não depende dos detalhes de como a instância da classe do produto é criada e implementada. Enfatiza que uma série de objetos de produtos relacionados (pertencentes à mesma família de produtos) são usados ​​em conjunto para criar objetos que exigem muito código repetitivo para fornecer uma biblioteca de classes de produtos, todos os produtos aparecendo com a mesma interface, para que o cliente não depende da implementação específica

vantagem:

        Isolamento de código de produtos específicos na camada de aplicação, sem necessidade de se preocupar com os detalhes de criação

        Crie uma família de produtos juntos

deficiência:

        Especifica todos os conjuntos de produtos possíveis que podem ser criados e a dificuldade de expansão de novos produtos na família de produtos;

        Aumenta a abstração e a dificuldade de compreensão do sistema

resumo

Padrão de Fábrica Simples: Embora não esteja de acordo com os princípios de design até certo ponto, na verdade é o mais usado

Padrão de método de fábrica: Estenda adicionando novas classes de fábrica sem modificar as classes existentes

Abstract Factory Pattern: Você não pode adicionar produtos, você pode adicionar famílias de produtos

(Piada: Não há nada que não possa ser resolvido adicionando uma camada)

Ao final do estudo, devemos saber uma coisa claramente, ou seja, não colocar a carroça na frente dos bois. Aprendemos padrões de projeto para projetar melhor o software, não para usar um determinado padrão de projeto.

Acho que você gosta

Origin blog.csdn.net/qq_44709970/article/details/124374065
Recomendado
Clasificación