首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中使用可调用而不是抽象工厂模式?

如何在Python中使用可调用而不是抽象工厂模式?
EN

Stack Overflow用户
提问于 2021-11-14 03:56:54
回答 1查看 82关注 0票数 1

我一直在尝试弄清楚在Python中何时何地使用不同的模式。我偶然发现了这个文档:https://python-patterns.guide/gang-of-four/abstract-factory/

现在,这让我想知道,我如何才能按照他在我的代码中所说的做。这是我的实现是一个抽象工厂。不确定是否正确。

代码语言:javascript
复制
from abc import abstractmethod, ABC

from sqlalchemy.orm import Session

from managers.database_manager import DatabaseManager
from managers.log_manager import LogManager
from managers.sqlalchemy_manager import get_db
from models.bal.post import Post
from models.dal.models import Post as ORMPost


class PostsManager(ABC):
    def __init__(self):
        pass

    @abstractmethod
    def get_posts(self):
        pass

    @abstractmethod
    def get_post(self, post_id):
        pass

    @abstractmethod
    def create_post(self, post: Post):
        pass

    @abstractmethod
    def delete_post(self, post_id):
        pass

    @abstractmethod
    def update_post(self, post_id, post: Post):
        pass


class PostsManagerFactory:
    @staticmethod
    def get_posts_manager(use_orm=True) -> PostsManager:
        if use_orm:
            return PostsManagerWithORM()
        else:
            return PostsManagerWithoutORM()


class PostsManagerWithORM(PostsManager):

    def get_posts(self):
        db: Session = get_db()
        posts = db.query(ORMPost).all()
        return posts

    def get_post(self, post_id):
        pass

    def create_post(self, post: Post):
        pass

    def delete_post(self, post_id):
        pass

    def update_post(self, post_id, post: Post):
        pass


class PostsManagerWithoutORM(PostsManager):
    def __init__(self):
        super().__init__()
        self.db_manager = DatabaseManager()

    def get_posts(self):
        posts = self.db_manager.execute_query("select * from posts")
        return posts

    def get_post(self, post_id):
        post = self.db_manager.execute_query("SELECT * FROM posts WHERE id='%s'", (post_id,), single_record_flag=True)
        return post

    def create_post(self, post: Post):
        post = self.db_manager.execute_query("INSERT INTO posts (title, content) VALUES (%s, %s) RETURNING *",
                                             (post.title, post.content), single_record_flag=True)

        return post

    def delete_post(self, post_id):
        post = self.db_manager.execute_query("DELETE FROM posts WHERE id = %s RETURNING *", (post_id,),
                                             single_record_flag=True)
        return post

    def update_post(self, post_id, post: Post):
        post = self.db_manager.execute_query(
            "UPDATE posts SET title = %s, content = %s, published = %s WHERE id= %s RETURNING *",
            (post.title, post.content, post.published, post_id),
            single_record_flag=True)
        return post

下面是我调用这些方法的方式:

代码语言:javascript
复制
posts_manager = PostsManagerFactory.get_posts_manager()
posts = posts_manager.get_posts()

我的第一个问题,这是使用抽象工厂模式的正确方式吗?如果没有,请让我知道,我可能会问一个新的问题。不管怎么说,如果是这样的话,为什么文档说使用可伸缩模式比使用抽象工厂模式更好,在这种情况下我该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-14 06:32:16

在你的最后一条评论之后。

对于这个用例,我不会使用抽象工厂模式。我可以问一下你为什么要用它吗?

当我建议通过提取函数的get_posts_manager来删除PostsManagerFactory类时,我指的是替换以下代码片段

代码语言:javascript
复制
class PostsManagerFactory:
    @staticmethod
    def get_posts_manager(use_orm=True) -> PostsManager:
        if use_orm:
            return PostsManagerWithORM()
        else:
            return PostsManagerWithoutORM()

有了这个

代码语言:javascript
复制
def get_posts_manager(use_orm=True) -> PostsManager:
    if use_orm:
        return PostsManagerWithORM()
    else:
        return PostsManagerWithoutORM()

你可能想要这样缩短

代码语言:javascript
复制
def get_posts_manager(use_orm=True) -> PostsManager:
    return PostsManagerWithORM() if use_orm else PostsManagerWithoutORM()

然后,您只需通过调用函数即可在代码中使用它

代码语言:javascript
复制
posts_manager = get_posts_manager() # <----
posts = posts_manager.get_posts()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69960168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档