minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Factory Pattern é um padrão de design comumente usado em programação orientada a objetos.padrão criacional tipo de.O padrão de fábrica é usado principalmente para criar objetos, mas é diferente de usá-lo diretamente no código.new
A criação de palavras-chave é diferente porque cria objetos por meio de uma interface comum, separando assim o processo de criação de objetos do uso do código do cliente. A seguir está uma introdução detalhada ao padrão de fábrica:
Os padrões de fábrica são divididos principalmente em três tipos: padrão de fábrica simples (padrão de fábrica estático), padrão de método de fábrica e padrão de fábrica abstrato.
Diagrama de classes de padrão de fábrica simples
Padrão de método de fábrica
padrão de fábrica abstrato
O padrão de fábrica tem uma ampla gama de aplicações no desenvolvimento real, como conexões de banco de dados, controles de UI, processamento de arquivos, registro, comunicações de rede, filas de mensagens, estruturas de dados, criptografia e descriptografia, envio de mensagens e agendamento de tarefas. Nestes cenários, a utilização do padrão de fábrica pode separar o processo de criação de objetos do processo de utilização, melhorando a flexibilidade e escalabilidade do sistema.
No padrão de fábrica simples, definimos uma classe de fábrica que pode retornar instâncias de diferentes tipos com base nos parâmetros passados.
Abaixo está um exemplo de um padrão de fábrica simples escrito em Java. Criaremos uma fábrica de formas que pode produzir instâncias de círculos, retângulos e quadrados. Primeiro, definimos uma interface de forma (Shape) e diversas classes concretas (Circle, Rectangle, Square) que implementam esta interface.
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Rectangle::draw() method.");
- }
- }
-
- // 正方形类
- class Square implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Square::draw() method.");
- }
- }
A seguir, definimos uma classe de fábrica (ShapeFactory) que utiliza métodos estáticos para gerar objetos de forma.
- // 形状工厂类
- class ShapeFactory {
-
- // 使用 getShape 方法获取形状类型的对象
- public static Shape getShape(String shapeType){
- if(shapeType == null){
- return null;
- }
- if(shapeType.equalsIgnoreCase("CIRCLE")){
- return new Circle();
- } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
- return new Rectangle();
- } else if(shapeType.equalsIgnoreCase("SQUARE")){
- return new Square();
- }
-
- return null;
- }
- }
Finalmente, podemos usar uma classe de fábrica para obter objetos de forma e chamar seusdraw
método.
- public class FactoryPatternDemo {
-
- public static void main(String[] args) {
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = ShapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 获取 Rectangle 的对象,并调用它的 draw 方法
- Shape shape2 = ShapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 获取 Square 的对象,并调用它的 draw 方法
- Shape shape3 = ShapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
Neste exemplo,ShapeFactory
classe é responsável por criarShape
Uma instância da interface.O código do cliente faz isso passando informações de tipo (por exemplo, string) paraShapeFactory
método estático da classegetShape
para obter uma instância da forma desejada. Desta forma, o cliente fica desacoplado da implementação da classe específica e atende ao princípio de abertura e fechamento, ou seja, novas classes de shape podem ser estendidas sem modificar o código do cliente. No entanto, uma grande desvantagem do padrão de fábrica simples é que se o sistema precisar ser ampliado com novas famílias de produtos (como cores além de formas, etc.), a classe de fábrica precisará ser modificada, o que viola parte do padrão aberto. -princípio fechado. Nesse caso, considere usar o padrão Factory Method ou o padrão Abstract Factory.
Ainda tomando forma como exemplo, utilizamos métodos de engenharia para criá-lo.
Primeiro defina a interface de forma (Produto) e crie três classes de implementação.
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Rectangle::draw() method.");
- }
- }
-
- // 正方形类
- class Square implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Square::draw() method.");
- }
- }
A seguir, defina a interface do criador (Creator) e o criador concreto (Concrete Creator):
- // 创建者接口
- interface ShapeFactory {
- Shape getShape(String shapeType);
- }
-
- // 具体创建者类
- class RectangleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("RECTANGLE")) {
- return new Rectangle();
- }
- return null;
- }
- }
-
- class CircleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("CIRCLE")) {
- return new Circle();
- }
- return null;
- }
- }
-
- class SquareFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("SQUARE")) {
- return new Square();
- }
- return null;
- }
- }
Finalmente, use a classe criadora concreta para obter os objetos de forma e chamar seusdraw
método:
- public class FactoryMethodPatternDemo {
-
- public static void main(String[] args) {
- ShapeFactory shapeFactory = new CircleFactory();
-
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = shapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 使用 RectangleFactory 来获取 Rectangle 的对象
- shapeFactory = new RectangleFactory();
- Shape shape2 = shapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 使用 SquareFactory 来获取 Square 的对象
- shapeFactory = new SquareFactory();
- Shape shape3 = shapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
Neste exemplo,Criamos uma classe de fábrica correspondente para cada classe de forma (Embora em aplicações reais, geralmente haja uma estrutura de classes de fábrica mais geral, talvez por meio de arquivos de configuração ou reflexão para evitar escrever classes de fábrica separadas para cada classe de produto). Isso ajuda a demonstrar os fundamentos do padrão Factory Method,Ou seja, deixe a subclasse de fábrica decidir qual classe instanciar . No entanto, para o caso simples deste exemplo, você pode estar mais inclinado a usar o padrão Simple Factory ou considerar outros padrões de design para reduzir a duplicação de código.
Este exemplo toma como exemplo telefones celulares, produtos abstratos relacionados a telefones celulares (como telas, baterias, sistemas operacionais, etc.) e cria classes de produtos específicas para implementar essas interfaces. Podemos então definir interfaces de fábrica abstratas e classes de fábrica concretas para produzir esses produtos. Aqui está um exemplo simplificado que mostra como usar o padrão Abstract Factory para produzir componentes (telas e baterias) para diferentes marcas e modelos de telefones celulares:
Primeiro, defina a interface do produto e produtos específicos:
- // 屏幕接口
- interface Screen {
- void display();
- }
-
-
- // 高端屏幕的实现
- class HighEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示高清屏幕");
- }
- }
-
- // 低端屏幕的实现
- class LowEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示普通屏幕");
- }
- }
-
-
- // 电池接口
- interface Battery {
- void charge();
- }
-
-
- // 高效电池的实现
- class HighEfficiencyBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("快速充电");
- }
- }
-
- // 标准电池的实现
- class StandardBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("标准充电");
- }
- }
A seguir, defina a interface de fábrica abstrata e a classe de fábrica concreta:
- // 手机组件工厂接口
- interface PhoneFactory {
- Screen createScreen();
- Battery createBattery();
- }
-
- // 高端手机工厂
- class HighEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new HighEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new HighEfficiencyBattery();
- }
- }
-
- // 低端手机工厂
- class LowEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new LowEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new StandardBattery();
- }
- }
Finalmente, o código do cliente, que usa uma fábrica abstrata para criar objetos de produto concretos:
- public class PhoneFactoryPatternDemo {
- public static void main(String[] args) {
- // 使用高端手机工厂
- PhoneFactory highEndFactory = new HighEndPhoneFactory();
- Screen highEndScreen = highEndFactory.createScreen();
- Battery highEndBattery = highEndFactory.createBattery();
-
- highEndScreen.display();
- highEndBattery.charge();
-
- // 使用低端手机工厂
- PhoneFactory lowEndFactory = new LowEndPhoneFactory();
- Screen lowEndScreen = lowEndFactory.createScreen();
- Battery lowEndBattery = lowEndFactory.createBattery();
-
- lowEndScreen.display();
- lowEndBattery.charge();
- }
- }
Neste exemplo, definimos duas fábricas de telefones celulares (alta e baixa), cada uma capaz de produzir um tipo específico de tela e bateria.O código do cliente interage com a classe de fábrica específica por meio da interface abstrata de fábrica, conseguindo assim o desacoplamento da classe de produto específica. . Desta forma, se precisarmos adicionar novos tipos de telefone no futuro (por exemplo, telefones de gama média), só precisaremos adicionar novas classes de produtos e classes de fábrica correspondentes sem modificar o código do cliente existente.
O padrão de fábrica é um padrão de design muito útil,Ele encapsula o processo de criação de objetos, reduz o acoplamento, melhora a escalabilidade do programa e a facilidade de manutenção, etc. , tem sido amplamente utilizado no desenvolvimento de software.No entanto, também tem algunsDesvantagens, como responsabilidades excessivas de fábrica, dificuldade de expansão do sistema, etc. . Portanto, em aplicações práticas, é necessário fazer compromissos e escolhas com base em cenários e necessidades específicas.
Se o padrão de fábrica (fábrica simples, método de fábrica, fábrica abstrata) for útil para você, lembre-se de gostar e colecioná-lo.