Java设计模式--抽象工厂模式

抽象工厂模式是一种设计模式,允许创建一系列相关的产品对象,无需指定它们的具体类。这种模式将产品族的创建与具体的产品实现分离,方便更换产品族,但增加新产品结构可能需要修改代码。示例展示了在不同操作系统下创建按钮和文本的抽象工厂模式实现。
摘要由CSDN通过智能技术生成

抽象工厂模式


前言

工厂方法模式中每个具体的工厂只需要生产一种具体产品,但在抽象工厂模式中一个具体的工厂可以生产一组相关的具体产品。一组产品称为产品族,产品族中的每一个产品都属于一个产品继承等级结构。

一、抽象工厂模式概述

1.抽象工厂模式与工厂模式区别:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对对个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。

2.抽象工厂的定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

二、抽象工厂模式结构与实现

1.抽象工厂模式结构

(1)AbstractFactory(抽象工厂):声明一组用于创建一族产品的方法。,每一种方法对应一种产品。
(2)ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成一个产品族。
(3)AbstractProduct(抽象产品):为每种产品声明接口,在抽象产品中声明产品所具有的业务方法。
(4)ConcreteProduct(具体产品):定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

2.结构图
在这里插入图片描述3.代码示例:
在每个操作系统中都有一个由图形组成的构件家族,可以通过一个抽象角色给出功能定义,而由具体子类给出不同操作系统下的具体实现。如系统中包含两个产品等级结构,分别为Button与Text;同时3个产品族,即UNIX产品族,Linux产品族与Windows产品族。用抽象工厂模式实现。
在这里插入图片描述(1)Button:按钮接口,充当抽象产品。

public interface Button {
    public void display();
}

(2)UnixButton:Unix按钮类,充当具体产品类

public class UnixButton implements Button {
    @Override
    public void display() {
        System.out.println("unix button...");
    }
}

(3)WinButton:Win按钮类,充当具体产品类

public class WinButton implements Button {
    @Override
    public void display() {
        System.out.println("Win Button...");
    }
}

(4)Text:文本接口,充当抽象产品

public interface Text {
    public void display();
}

(5)UnixText:Unix文本类,充当具体产品类

public class UnixText implements Text {
    @Override
    public void display() {
        System.out.println("Unix Text...");
    }
}

(6)WinText:Win文本类,,充当具体产品类

public class WinText implements Text {
    @Override
    public void display() {
        System.out.println("Win Text...");
    }
}

(7)AbstractFactory:抽象工厂接口

public interface AbstractFactory {
    Button createButton();
    Text createText();
}

(8)UnixFactory:具体工厂类

public class UnixFactory implements AbstractFactory {

    @Override
    public Button createButton() {
        System.out.println("createButton被调用...");
        return new UnixButton();
    }

    @Override
    public Text createText() {
        System.out.println("createText被调用...");
        return new UnixText();
    }
}

(9)WinFactory :具体工厂类

public class WinFactory implements AbstractFactory {
    @Override
    public Button createButton() {
        System.out.println("createButton被调用000");
        return new UnixButton();
    }

    @Override
    public Text createText() {
        System.out.println("createText被调用...");
        return new UnixText();
    }
}

(10)测试类:

public class Demo {
    public static void main(String[] args) {
        WinButton winButton = new WinButton();
        winButton.display();
        UnixText unixText  =new UnixText();
        unixText.display();
        UnixFactory unixFactory = new UnixFactory();
        unixFactory.createButton();
        unixFactory.createText();
        WinFactory winFactory = new WinFactory();
        winFactory.createButton();
        winFactory.createText();
    }
}


总结

1.抽象工厂模式隔离了具体类的生成,更换一个具体的工厂变得就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的公共接口,只需要改变具体工厂的实例就可以在某种程度上改变整个软件系统的行为

2.当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象

3.增加新的产品族很方便,无需修改已有系统,符合开闭原则。

4.增加新的产品结构麻烦,需要较大的修改。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值