您的位置:首页 > 其它

设计模式之抽象工厂模式

2017-06-30 14:50 387 查看

前言:

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

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

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

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

二. 抽象工厂的实例:

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

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. 像PersonFactory factory1 = new HNFactory(),在一个应用中初始化的时候只会出现一次,改变一个具体工厂变得容易,只需要改变具体的工厂,就可以使用不同的产品配置。

2. 让创建实例的过程与客户端分离,客户端通过它们的抽象接口,操纵实例,产品的具体类名也被工厂分离,不会出现在,客户端代码中。

抽象工厂的缺点:抽象工厂方便切换产品系列,却在新增功能时候,却需要更改三个工厂类,代码改动太大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: