[英]How to use callables instead of Abstract Factory Pattern in Python?
我一直試圖弄清楚在 Python 中何時何地使用不同的模式。 我遇到了這個文件: https : //python-patterns.guide/gang-of-four/abstract-factory/
現在這讓我想知道我該如何做他在我的代碼中所說的。 這是我的實現是一個抽象工廠。 不確定它是否正確。
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
這是我調用這些方法的方式:
posts_manager = PostsManagerFactory.get_posts_manager()
posts = posts_manager.get_posts()
我的第一個問題,是使用抽象工廠模式的正確方法嗎? 如果不是,請告訴我,我可能會問一個新問題。 無論如何,如果是這樣,為什么該文檔說使用可調用對象比使用抽象工廠模式更好,在這種情況下我該怎么做?
關注你最后一條評論。
我不會在這個用例中使用抽象工廠模式。 請問你為什么要使用它?
當我建議通過將get_posts_manager
到函數來刪除PostsManagerFactory
類時,我的意思是替換此代碼片段
class PostsManagerFactory:
@staticmethod
def get_posts_manager(use_orm=True) -> PostsManager:
if use_orm:
return PostsManagerWithORM()
else:
return PostsManagerWithoutORM()
有了這個
def get_posts_manager(use_orm=True) -> PostsManager:
if use_orm:
return PostsManagerWithORM()
else:
return PostsManagerWithoutORM()
您可能想以這種方式縮短
def get_posts_manager(use_orm=True) -> PostsManager:
return PostsManagerWithORM() if use_orm else PostsManagerWithoutORM()
然后,您可以通過調用函數在代碼中使用它
posts_manager = get_posts_manager() # <----
posts = posts_manager.get_posts()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.