设计模式之抽象工厂模式

来源:互联网 发布:java变量定义规则 编辑:程序博客网 时间:2024/05/17 23:25

前言:

抽象工厂模式(Abstract Factory Pattern)是提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

一. 抽象工厂模式的简介:

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象,方便切换产品系列。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

二. 抽象工厂的实例:

实例:脸萌APP中,实现多款风格和不同性别头像的创建。

  1. UML类图模型:

抽象工厂模式类图

2 .男女款式接口:

男孩款式:

package com.test.service.sex;/** * 男孩款式 * @author 葫芦娃 * */public interface Boy {    public void drawMan();}

女孩款式:

package com.test.service.sex;/** * 女孩款式 * @author 葫芦娃 * */public interface Girl {    public void drawWomen();}

3 .产品类:

新年风格男款类:

package com.test.impl.product;import com.test.service.sex.Boy;/** * 新年风格男款 * @author 葫芦娃 * */public class HNBoy implements Boy {    @Override    public void drawMan() {        System.out.println("-----------------新年风格男款--------------------");    }}

新年风格女款类:

package com.test.impl.product;import com.test.service.sex.Girl;/** * 新年风格女款 * @author 葫芦娃 * */public class HNGirl implements Girl {    @Override    public void drawWomen() {        System.out.println("-----------------新年风格女款--------------------");    }}

圣诞风格男款类:

package com.test.impl.product;import com.test.service.sex.Boy;/** * 圣诞风格男款 * @author 葫芦娃 * */public class MCBoy implements Boy {    @Override    public void drawMan() {        System.out.println("-----------------圣诞风格男款--------------------");    }}

圣诞风格女款类:

package com.test.impl.product;import com.test.service.sex.Girl;/** * 圣诞风格女款 * @author 葫芦娃 * */public class MCGirl implements Girl {    @Override    public void drawWomen() {        System.out.println("-----------------圣诞风格女款--------------------");    }}

4 .人物抽象工厂类

package com.test.service.factory;import com.test.service.sex.Boy;import com.test.service.sex.Girl;/** * 人物的实现接口 * @author 葫芦娃 * */public interface PersonFactory {    //男孩接口    public Boy getBoy();    //女孩接口    public Girl getGirl();}

5 . 两种主题风格的工厂类

新年风格工厂类:

package com.test.service.holiday;import com.test.impl.product.HNBoy;import com.test.impl.product.HNGirl;import com.test.service.factory.PersonFactory;import com.test.service.sex.Boy;import com.test.service.sex.Girl;/** * 新年风格工厂(Happy NewYear Factory) * @author 葫芦娃 * */public class HNFactory implements PersonFactory {    @Override    public Boy getBoy() {        return new HNBoy();    }    @Override    public Girl getGirl() {        return new HNGirl();    }}

圣诞风格工厂:

package com.test.service.holiday;import com.test.impl.product.MCBoy;import com.test.impl.product.MCGirl;import com.test.service.factory.PersonFactory;import com.test.service.sex.Boy;import com.test.service.sex.Girl;/** * 圣诞风格工厂(Merry Christmas Factory) * @author 葫芦娃 * */public class MCFctory implements PersonFactory {    @Override    public Boy getBoy() {        return new MCBoy();    }    @Override    public Girl getGirl() {        return new MCGirl();    }}

6 . 客户端:

package com.test.client;import com.test.service.factory.PersonFactory;import com.test.service.holiday.HNFactory;import com.test.service.holiday.MCFctory;import com.test.service.sex.Boy;import com.test.service.sex.Girl;/** * 客户端 * @author 葫芦娃 * */public class Client {    public static void main(String[] args){        PersonFactory factory1 = new HNFactory();        Boy boy1 =  factory1.getBoy();        boy1.drawMan();        Girl girl1 = factory1.getGirl();        girl1.drawWomen();        PersonFactory factory2 = new MCFctory();        Boy boy2 = factory2.getBoy();        boy2.drawMan();        Girl girl2 = factory2.getGirl();        girl2.drawWomen();    }}
  1. 运行结果:
-----------------新年风格男款-------------------------------------新年风格女款-------------------------------------圣诞风格男款-------------------------------------圣诞风格女款--------------------

三. 总结:

抽象工厂的优点
1. 像PersonFactory factory1 = new HNFactory(),在一个应用中初始化的时候只会出现一次,改变一个具体工厂变得容易,只需要改变具体的工厂,就可以使用不同的产品配置。
2. 让创建实例的过程与客户端分离,客户端通过它们的抽象接口,操纵实例,产品的具体类名也被工厂分离,不会出现在,客户端代码中。

抽象工厂的缺点:抽象工厂方便切换产品系列,却在新增功能时候,却需要更改三个工厂类,代码改动太大。