您的位置:首页 > 编程语言 > Java开发

设计模式——抽象工厂模式及在jdk中的应用+几种工厂模式的比较

2017-08-17 16:39 525 查看
http://ichennan.com/2016/08/09/DesignPattern.html    http://blog.csdn.net/liruikqn/article/details/12888511



抽象工厂模式(Abstract Factory)

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

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

类型:创建类模式

抽象工厂模式与工厂方法模式的区别

        抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。



可以看到产品族包括ProductA和ProductB两种产品,每个具体工厂都能生产这两种产品,只是ConcreteFactory1生产的等级为1的族产品;ConcreteFactory2生产的是等级为2的族产品。下面以上图为模型,写一个demo,测试抽象工厂模式。
抽象工厂:AbstractFactory接口

[html] view
plain copy

//抽象工厂,定义了生产族产品的方法;  

public interface AbstractFactory {  

    public ProductA factoryA();  

    public ProductB factoryB();  

}  

抽象产品:ProductA接口

[html] view
plain copy

//抽象产品A定义了产品的公共方法,产品A和B属于一个产品族  

public interface ProductA {  

    public void method1();  

    public void method2();  

}  

抽象产品:ProductB接口

[html] view
plain copy

//抽象产品B定义了产品的公共方法,产品A和B属于一个产品族  

public interface ProductB {  

    public void method1();  

    public void method2();  

}  

具体工厂(生产等级为2的族产品):ConcreteFactory1类

[html] view
plain copy

//ConcreateFactory1是用来生产等级为1的产品A,B的具体工厂;  

public class ConcreateFactory1 implements AbstractFactory {  

  

    //生产等级为1的产品A  

    @Override  

    public ProductA factoryA() {  

        // TODO Auto-generated method stub  

        return new ConcreateProductA1();  

    }  

  

      

    //生产等级为1的产品B  

    @Override  

    public ProductB factoryB() {  

        // TODO Auto-generated method stub  

        return new ConcreateProductB1();  

    }  

  

}  

具体工厂(生产等级为1的族产品):ConcreteFactory2类

[html] view
plain copy

public class ConcreateFactory2 implements AbstractFactory {  

  

    //生产等级为2的产品A  

    @Override  

    public ProductA factoryA() {  

        // TODO Auto-generated method stub  

        return new ConcreateProductA2();  

    }  

  

    //生产等级为2的产品B  

    @Override  

    public ProductB factoryB() {  

        // TODO Auto-generated method stub  

        return new ConcreateProductB2();  

    }  

}  

具体产品(等级为1的A产品):ConcreteProductA1类

[html] view
plain copy

//等级为1的具体产品A  

public class ConcreateProductA1 implements ProductA {  

  

    @Override  

    public void method1() {  

        // TODO Auto-generated method stub  

        System.out.println("等级为1的产品A的method1()");  

    }  

  

    @Override  

    public void method2() {  

        // TODO Auto-generated method stub  

        System.out.println("等级为1的产品A的method2()");  

    }  

}  

具体产品(等级为2的A产品):ConcreteProductA2类

[html] view
plain copy

//等级为2的具体产品A  

public class ConcreateProductA2 implements ProductA {  

  

    @Override  

    public void method1() {  

        // TODO Auto-generated method stub  

        System.out.println("等级为2的产品A的method1()");  

    }  

  

    @Override  

    public void method2() {  

        // TODO Auto-generated method stub  

        System.out.println("等级为2的产品A的method2()");  

    }  

}  

具体产品(等级为1的B产品):ConcreteProductB1类

[html] view
plain copy

//等级为1的产品B  

public class ConcreateProductB1 implements ProductB{  

  

    @Override  

    public void method1() {  

        // TODO Auto-generated method stub  

        System.out.println("等级为1的产品B的method1()");  

    }  

  

    @Override  

    public void method2() {  

        // TODO Auto-generated method stub  

        System.out.println("等级为1的产品B的method2()");  

    }  

}  

具体产品(等级为2的B产品):ConcreteProductB2类

[html] view
plain copy

//等级为2的产品B  

public class ConcreateProductB2 implements ProductB {  

  

    @Override  

    public void method1() {  

        // TODO Auto-generated method stub  

        System.out.println("等级为2的产品B的method1()");  

    }  

  

    @Override  

    public void method2() {  

        // TODO Auto-generated method stub  

        System.out.println("等级为2的产品B的method2()");  

    }  

}  

使用场景:

JDK中体现:
(1)Java.sql包
(2)UIManager(swing外观)

类图:





===================================


简单工厂模式

简单工厂模式不是23种里的一种,简而言之,就是有一个专门生产某个产品的类。

比如下图中的鼠标工厂,专业生产鼠标,给参数0,生产戴尔鼠标,给参数1,生产惠普鼠标。




工厂模式

工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口。

戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。

生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建。

后续直接调用鼠标工厂.生产鼠标()即可




抽象工厂模式

抽象工厂模式也就是不仅生产鼠标,同时生产键盘。

也就是PC厂商是个父类,有生产鼠标,生产键盘两个接口。

戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。

创建工厂时,由戴尔工厂创建。

后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。



在抽象工厂模式中,假设我们需要增加一个工厂

假设我们增加华硕工厂,则我们需要增加华硕工厂,和戴尔工厂一样,继承PC厂商。

之后创建华硕鼠标,继承鼠标类。创建华硕键盘,继承键盘类。

即可。



在抽象工厂模式中,假设我们需要增加一个产品

假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。

之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。

以上。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: