Python 간단 한 공장, 공장 방법, 추상 적 인 공장 설계 모델 실현
대상 을 대상 으로 공장 은 다른 유형의 대상 을 만 드 는 클래스 를 표시 합 니 다.공장 소유:
공장 모델 은 세 가지 변형 이 있다.
이루어지다
단순 공장
# ABCMeta Python ,
from abc import ABCMeta, abstractmethod
# , say ,
class Animal(metaclass=ABCMeta):
@abstractmethod
def say(self):
pass
# , , say
class Dog(Animal):
def say(self):
print('i am dog')
# , , say
class Cat(Animal):
def say(self):
print('i am cat')
#
class ForestFactory(object):
# say , , say
def say_something(self, object_type):
return eval(object_type)().say()
if __name__ == '__main__':
ff = ForestFactory()
animal = 'Cat'
ff.say_something(animal)
'''
i am cat'''
공장 방법
각 페이지 에 개인 정 보 를 표시 하 는 구역 이 있다 고 가정 하지만 내용 이 다 르 면 디자인 코드 는 다음 과 같다.
from abc import ABCMeta, abstractmethod
# ,
class Section(metaclass=ABCMeta):
@abstractmethod
def describe(self):
pass
# , ( )
#
class PersonalSection(Section):
def describe(self):
print('personal section')
#
class AlbumSection(Section):
def describe(self):
print('album')
#
class PatentSection(Section):
def describe(self):
print('patent')
#
class PublicationSection(Section):
def describe(self):
print('publication')
# , create_profile
class Profile(metaclass=ABCMeta):
def __init__(self):
self.sections = []
self.create_profile()
@abstractmethod
def create_profile(self):
pass
def get_sections(self):
return self.sections
def add_sections(self, section):
self.sections.append(section)
#
class ConcreteCreator1(Profile):
def create_profile(self):
# 、 、
self.add_sections(PersonalSection())
self.add_sections(PatentSection())
self.add_sections(PublicationSection())
class ConcreteCreator2(Profile):
def create_profile(self):
# 、
self.add_sections(PersonalSection())
self.add_sections(AlbumSection())
if __name__ == '__main__':
# ConcreteCreator1
profile_type = 'ConcreteCreator1'
profile = eval(profile_type)()
print(type(profile).__name__)
print(profile.get_sections())
'''
ConcreteCreator1
[<__main__.personalsection object="" at="">, <__main__.patentsection object="" at="">, <__main__.publicationsection object="" at="">]'''
공장 방법의 장점
추상 공장
피자 가게 가 다양한 피 자 를 제공한다 고 가정 하면 추상 적 인 공장:
''' :
1. , 。
2. , 。'''
from abc import ABCMeta, abstractmethod
class PizzaFactory(metaclass=ABCMeta):
#
@abstractmethod
def create_veg_pizza(self):
pass
#
@abstractmethod
def create_non_veg_pizza(self):
pass
class USAPizzaFactory(PizzaFactory):
# USA
def create_veg_pizza(self):
return CornPizza()
# USA
def create_non_veg_pizza(self):
return BeefPizza()
class ChinaPizzaFactory(PizzaFactory):
#
def create_veg_pizza(self):
return FruitsPizza()
#
def create_non_veg_pizza(self):
return MuttonPizza()
# 4 ( )
class VegPizza(metaclass=ABCMeta):
@abstractmethod
def prepare(self, veg_pizza):
pass
#
class NonVegPizza(metaclass=ABCMeta):
@abstractmethod
def serve(self, veg_pizza):
pass
class CornPizza(VegPizza):
def prepare(self):
print(type(self).__name__, ' ')
class BeefPizza(NonVegPizza):
def serve(self, veg_pizza):
print(type(self).__name__, ' , ', type(veg_pizza).__name__,' ')
class FruitsPizza(VegPizza):
def prepare(self):
print(type(self).__name__, ' ')
class MuttonPizza(NonVegPizza):
def serve(self, veg_pizza):
print(type(self).__name__, ' , ', type(veg_pizza).__name__,' ')
class PizzaStore(object):
def __init__(self):
pass
def make_pizzas(self):
# ( ),
for factory in [USAPizzaFactory(), ChinaPizzaFactory()]:
self.factory = factory
self.non_veg_pizza = self.factory.create_non_veg_pizza()
self.veg_pizza = self.factory.create_veg_pizza()
#
self.veg_pizza.prepare()
self.non_veg_pizza.serve(self.veg_pizza)
pizza = PizzaStore()
pizza.make_pizzas()
공장 방법 과 추상 공장 의 비교
공장 방법
추상 공장
대상 을 만 드 는 방법 을 엽 니 다.
하나 이상 의 공장 방법 을 포함 하여 일련의 대상 을 만 듭 니 다.
상속 과 하위 클래스 를 사용 하여 어떤 대상 을 만 들 지 결정 합 니 다.
유 틸 리 티 조합 은 대상 을 만 드 는 작업 을 다른 클래스 에 맡 깁 니 다.
제품 만 들 기
관련 시리즈 (그룹) 제품 만 들 기
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.