抽象⼯⼚模式(Java、Python)、建造者模式(Java、
Python)
⽬录
建造者模式与抽象⼯⼚模式相似,也⽤来创建复杂对象。两者的区别在于,建造者模式着重⼀步步构造⼀个复杂对象(顺序),⽽抽象⼯⼚模式着重于多个系列的产品对象。
⼀、试画出抽象⼯⼚模式的模式结构图,并对模式进⾏分析
1.1 抽象⼯⼚模式结构图:
图1 抽象⼯⼚模式的模式结构图
抽象⼯⼚模式(Abstract Factory Pattern):提供⼀个创建⼀系列相关或相互依赖对象的接⼝,⽽⽆须指定它们具体的类。抽象⼯⼚模式⼜称为Kit模式,属于对象创建型模式。
由图1可知,抽象⼯⼚模式包含以下4个⾓⾊:
AbstactFactory(抽象⼯⼚):声明⼀组⽤于创建⼀族产品的⽅法,每个⽅法对应⼀种对象;在抽象⼯⼚中声明了多个⼯⼚⽅法, ⽤于创建不同类型的对象,抽象⼯⼚可以是接⼝,在这⾥是接⼝的形式;
ConcreteFactory1/2(具体⼯⼚):具体⼯⼚实现了抽象⼯⼚,每个⼯⼚⽅法返回⼀个具体对象,⼀个具体⼯⼚所创建的具体对象构成⼀个族;
AbstactProductA/B(抽象产品):定义了产品的规范,描述了产品的主要特性和功能,抽象⼯⼚模式有多个抽象产品;
ProductA1/A2/B1/B2(具体产品):实现了抽象产品⾓⾊所定义的接⼝,由具体⼯⼚来创建,它同具体⼯⼚之间是多对⼀的关系。
1.2 抽象⼯⼚模式的实现(Java)
抽象⼯⼚提供产品的⽣产⽅法。即,抽象⼯⼚接⼝代码如下:
interface AbstractFactory{
public void createProductA();
public void createProductB();
}
具体⼯⼚实现了产品的⽣成⽅法。对应具体产品类的代码如下,以具体⼯⼚ConcreteFactory1为例:
class ConcreteFactory1 implements AbstractFactory{
public ProductA2 createProductA()
{
return new AbstractProductA2();
}
public ProductaB2 createProductB()
{
return new AbstractProductB2();
}
}
抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象⼯⼚模式有多个抽象产品;同样的以接⼝AbstractProductA为例:interface AbstractProductA{
public void use();
}
对于实现AbstractProductA接⼝的ProductA1/A2类,使⽤该⼯⼚进⾏创建。其代码如下,以ProductA1类为例⼦:
public class ProductA1 implements AbstractProductA{
public void use(){
//加⼯实现产品A
}
}
1.3 抽象⼯⼚模式的优缺点
抽象⼯⼚模式提供⼀个创建⼀系列相关或相互依赖对象的接⼝,⽽⽆须指定它们具体的类。抽象⼯⼚模式⼜称为Kit模式,属于对象创建型模式。在很多软件系统中需要更换界⾯主题,要求界⾯中的按钮、⽂本框、背景⾊等⼀起发⽣改变时,可以使⽤抽象⼯⼚模式进⾏设计。
优点:
抽象⼯⼚模式隔离了具体类的⽣成,使得客户并不需要知道什么被创建。由于这种隔离,更换⼀个具体⼯⼚就变得相对容易。所有的具体⼯⼚都实现了抽象⼯⼚中定义的那些公共接⼝,因此只需改变具体⼯⼚的实例,就可以在某种程度上改变整个软件系统的⾏为。另外,应⽤抽象⼯⼚模式可以实现⾼内聚低耦合的设计⽬的,因此抽象⼯⼚模式得到了⼴泛的应⽤;
当⼀个产品族中的多个对象被设计成⼀起⼯作时,它能够保证客户端始终只使⽤同⼀个产品族中的对象。这对⼀些需要根据当前环境来决定其⾏为的软件系统来说,是⼀种⾮常实⽤的设计模式;
增加新的具体⼯⼚和产品族很⽅便,⽆须修改已有系统,符合“开闭原则”。
缺点:
在添加新的产品对象时,难以扩展抽象⼯⼚来⽣产新种类的产品,这是因为在抽象⼯⼚⾓⾊中规定了所有可能被创建的产品集合,要⽀持新种类的产品就意味着要对该接⼝进⾏扩展,⽽这将涉及到对抽象⼯⼚⾓⾊及其所有⼦类的修改,显然会带来较⼤的不便;
开闭原则的倾斜性(增加新的⼯⼚和产品族容易,增加新的产品等级结构⿇烦)。
1.4 抽象⼯⼚模式的实现(Python)
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# @Time :
python转java代码
# @Author :
# @Version:V 0.1
# @File : 抽象⼯⼚模式.py
# @desc : 定义⼀个⼯⼚类接⼝,让⼯⼚⼦类来创建⼀系列相关或相互依赖的对象
from abc import ABCMeta,abstractmethod
# --------抽象产品--------
class PhoneShell(metaclass=ABCMeta):
@abstractmethod
def show_shell(self):
pass
class CPU(metaclass=ABCMeta):
@abstractmethod
def show_cpu(self):
pass
class OS(metaclass=ABCMeta):
@abstractmethod
def show_os(self):
pass
# --------抽象⼯⼚--------
class PhoneFactory(metaclass=ABCMeta):
@abstractmethod
def make_shell(self):
pass
@abstractmethod
def make_cpu(self):
pass
@abstractmethod
def make_os(self):
pass
# --------具体产品--------
class SmallShell(PhoneShell):
def show_shell(self):
print("普通⼿机⼩⼿机壳")
class BigShell(PhoneShell):
def show_shell(self):
print("普通⼿机⼤⼿机壳")
class AppleShell(PhoneShell):
def show_shell(self):
print("苹果⼿机壳")
class SnapDragonCPU(CPU):
def show_cpu(self):
print("骁龙CPU")
class MediaTekCPU(CPU):
def show_cpu(self):
print("联发科CPU")
class AppleCPU(CPU):
def show_cpu(self):
print("苹果CPU")
class Android(OS):
def show_os(self):
print("Android操作系统")
class IOS(OS):
def show_os(self):
print("IOS系统")
# --------具体⼯⼚--------
class MiFactory(PhoneFactory):
def make_cpu(self):
return SnapDragonCPU()
def make_os(self):
return Android()
def make_shell(self):
return BigShell()
class HuaweiFactory(PhoneFactory): def make_cpu(self):
return MediaTekCPU()
def make_os(self):
return Android()
def make_shell(self):
return SmallShell()
class IPhoneFactory(PhoneFactory):
def make_cpu(self):
return AppleCPU()
def make_os(self):
return IOS()
def make_shell(self):
return AppleShell()
# --------客户端--------
class Phone:
def __init__(self, cpu, os, shell):
self.cpu = cpu
self.os = os
self.shell = shell
def show_info(self):
print("⼿机信息")
self.cpu.show_cpu()
self.os.show_os()
self.shell.show_shell()
def make_phone(factory):
cpu = factory.make_cpu()
os = factory.make_os()
shell = factory.make_shell()
return Phone(cpu, os, shell)
p1 = make_phone(MiFactory())
p1.show_info()
⼆、试画出建造者模式的模式结构图,并对模式进⾏分析。
2.1建造者模式结构图
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论