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

时间:2021-10-10 11:27:23

抽象工厂

https://blog.csdn.net/wyxhd2008/article/details/5597975

首先来看看这两者的定义区别:

工厂模式:定义一个用于创建对象的借口,让子类决定实例化哪一个类

抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类

个人觉得这个区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。

再来看看工厂方法模式与抽象工厂模式对比:

工厂方法模式

抽象工厂模式

针对的是一个产品等级结构 针对的是面向多个产品等级结构
一个抽象产品类 多个抽象产品类
可以派生出多个具体产品类 每个抽象产品类可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类 一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类只能创建一个具体产品类的实例 每个具体工厂类可以创建多个具体产品类的实例

简单工厂

https://www.cnblogs.com/zhangchenliang/p/3700820.html

这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。
它由三种角色组成:
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的Driver类。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。
具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Benz、Bmw类。

    1. abstract class Car{
    2. private String name;
    3. public abstract void drive();
    4. public String getName() {
    5. return name;
    6. }
    7. public void setName(String name) {
    8. this.name = name;
    9. }
    10. }
    11. //具体产品
    12. class Benz extends Car{
    13. public void drive(){
    14. System.out.println(this.getName()+"----go-----------------------");
    15. }
    16. }
    17. class Bmw extends Car{
    18. public void drive(){
    19. System.out.println(this.getName()+"----go-----------------------");
    20. }
    21. }
    22. //简单工厂
    23. class Driver{
    24. public static Car createCar(String car){
    25. Car c = null;
    26. if("Benz".equalsIgnoreCase(car))
    27. c = new Benz();
    28. else if("Bmw".equalsIgnoreCase(car))
    29. c = new Bmw();
    30. return c;
    31. }
    32. }
    33. //老板
    34. public class BossSimplyFactory {
    35. public static void main(String[] args) throws IOException {
    36. //老板告诉司机我今天坐奔驰
    37. Car car = Driver.createCar("benz");
    38. car.setName("benz");
    39. //司机开着奔驰出发
    40. car.drive();
    41. }
    42. <span style="font-family: courier new,courier;">}</span>

抽象工厂 和 工厂模式 区别:

https://www.zhihu.com/question/20367734

作者:名姓
链接:https://www.zhihu.com/question/20367734/answer/115807228
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口。
戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。
生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建。
后续直接调用鼠标工厂.生产鼠标()即可

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

抽象工厂模式

抽象工厂模式也就是不仅生产鼠标,同时生产键盘。
也就是PC厂商是个父类,有生产鼠标,生产键盘两个接口。
戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。
创建工厂时,由戴尔工厂创建。
后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。

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

DEMO

http://groovy-lang.org/design-patterns.html#_example

def guessFactory = [messages: GuessGameMessages, control: GuessGameControl, converter: GuessGameInputConverter]
def twoupFactory = [messages: TwoupMessages, control: TwoupControl, converter: TwoupInputConverter] class GameFactory {
def static factory
def static getMessages() { return factory.messages.newInstance() }
def static getControl() { return factory.control.newInstance() }
def static getConverter() { return factory.converter.newInstance() }
}
GameFactory.factory = twoupFactory
def messages = GameFactory.messages
def control = GameFactory.control
def converter = GameFactory.converter
println messages.welcome
def reader = new BufferedReader(new InputStreamReader(System.in))
while (control.moreTurns()) {
def input = reader.readLine().trim()
control.play(converter.convert(input))
}
println messages.done