设计模式之工厂模式
1. 简单工厂模式
这种模式简单,使用与业务逻辑简单的情景中使用!
使用说明:利用一个工厂类来创建相应的产品,如蔬菜工厂会生产土豆,西红柿…..等,不过土豆,西红柿都会实现蔬菜的特性!
下面是简单工厂的UML图:
代码如下所示:
食物总的接口:
package com.dai.factory.simplefactory;
/**
*
* @author戴礼明
*日期: 2016-4-22
*content:食物接口
*/
public interface Food {
public void color();
public void shape();
}
土豆类的实现:
package com.dai.factory.simplefactory;
/**
*
* @author戴礼明
*日期: 2016-4-22
*content:土豆
*/
public class Potato implements Food{
private String name;
public Potato() {
// TODO Auto-generatedconstructor stub
}
public Potato(String name) {
this.name=name;
}
public void color() {
System.out.println("我是"+name+",我的颜色是土黄色的!");
}
public void shape() {
System.out.println("我是"+name+",我的形状是圆的!");
}
}
西红柿类的实现:
package com.dai.factory.simplefactory;
/**
*
* @author戴礼明
*日期: 2016-6-3
*content:西红柿
*/
public class Tomato implements Food{
private String name;
public Tomato(String name) {
super();
this.name = name;
}
public void color() {
System.out.println("我是"+name+",颜色是红色的!");
}
public void shape() {
System.out.println("我是"+name+",是圆的!");
}
}
食物工厂类:
package com.dai.factory.simplefactory;
/**
*
* @author戴礼明
*日期: 2016-6-3
*content:食物工厂类
*/
public class FoodFactory {
/**
* 创建食物
* @param object
* @return
*/
public Food createFood(String object){
if("potato".equals(object)){
return new Potato("土豆");
}else if("tomato".equals(object)){
return new Tomato("西红柿");
}
return null;
}
}
测试类:
package com.dai.factory.simplefactory;
/**
*
* @author 戴礼明
*日期: 2016-6-3
*content:简单工厂测试
*/
public class SimpleFactory {
public static void main(String[] args) {
FoodFactory factory=new FoodFactory();
Food t=factory.createFood("tomato");
t.color();
Food t1=factory.createFood("potato");
t1.color();
}
}
2.工厂方法
说明:一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。
即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。“一对一”的关系。
UML图如下所示:
食物类的接口:
</pre><pre code_snippet_id="1707175" snippet_file_name="blog_20160603_5_9121747" name="code" class="java">
/**
*
* @author戴礼明
*日期: 2016-4-22
*content:食物接口
*/
public interface Food {
public void color();
public void shape();
}
土豆类的实现:
package com.dai.factory.factorymethod;
/**
*
* @author戴礼明
*日期: 2016-4-22
*content:食物接口
*/
public interface Food {
public void color();
public void shape();
}
西红柿类的实现:
package com.dai.factory.factorymethod;
/**
*
* @author戴礼明
*日期: 2016-4-22
*content:食物接口
*/
public interface Food {
public void color();
public void shape();
}
抽象工厂接口:
package com.dai.factory.factorymethod;
/**
*
* @author戴礼明
*日期: 2016-4-22
*content:食物接口
*/
public interface Food {
public void color();
public void shape();
}
土豆工厂:
package com.dai.factory.factorymethod;
/**
*
* @author戴礼明
*日期: 2016-6-3
*content:食物工厂类
*/
public class PotatoFactoryimplements Factory{
/**
* 创建食物
* @param object
* @return
*/
public Food createFood(){
return new Potato();
}
}
西红柿工厂:
<p align="left"><strong><span style="color:#7F0055;">package</span></strong> com.dai.factory.factorymethod;</p><p align="left"><span style="color:#3F5FBF;">/**</span></p><p align="left"><span style="color:#3F5FBF;"> * </span></p><p align="left"><span style="color:#3F5FBF;"> * </span><strong><span style="color:#7F9FBF;">@author</span></strong><span style="color:#3F5FBF;">戴礼明</span></p><p align="left"><span style="color:#3F5FBF;"> *</span><span style="color:#3F5FBF;">日期:</span><span style="color:#3F5FBF;"> 2016</span><span style="color:#7F7F9F;">-</span><span style="color:#3F5FBF;">6</span><span style="color:#7F7F9F;">-</span><span style="color:#3F5FBF;">3</span></p><p align="left"><span style="color:#3F5FBF;"> *content</span><span style="color:#3F5FBF;">:食物工厂类</span></p><p align="left"><span style="color:#3F5FBF;"> */</span></p><p align="left"><strong><span style="color:#7F0055;">public</span> <span style="color:#7F0055;">class</span></strong> TomatoFactory <strong><span style="color:#7F0055;">implements</span></strong> Factory{</p><p align="left"> </p><p align="left"> <span style="color:#3F5FBF;">/**</span></p><p align="left"><span style="color:#3F5FBF;"> * </span><span style="color:#3F5FBF;">创建食物</span></p><p align="left"><span style="color:#3F5FBF;"> * </span><strong><span style="color:#7F9FBF;">@param</span></strong><span style="color:#3F5FBF;"> object</span></p><p align="left"><span style="color:#3F5FBF;"> * </span><strong><span style="color:#7F9FBF;">@return</span></strong></p><p align="left"><span style="color:#3F5FBF;"> */</span></p><p align="left"> <strong><span style="color:#7F0055;">public</span></strong> Food createFood(){</p><p align="left"> <strong><span style="color:#7F0055;">return</span> <span style="color:#7F0055;">new</span></strong> Tomato();</p><p align="left"> }</p><p align="left"> </p><p align="left">}</p>
测试类:
package com.dai.factory.factorymethod;
/**
*
* @author戴礼明
*日期: 2016-6-3
*content:工厂方法测试
*/
public class SimpleFactory {
public static void main(String[] args) {
// Factory factory=new TomatoFactory();
Factory factory=new PotatoFactory();
factory.createFood().color();
}
}
3. 抽象工厂
说明:抽象工厂模式也有四种角色:抽象工厂、具体工厂、抽象产品和具体产品
UML图如下所示:
代码如下所示:
水果接口:
package com.dai.factory.abstractfactory;
/**
*
* @author戴礼明
*日期: 2016-6-3
*content:水果抽象类
*/
public interface Fruits {
public void fruitsName();
}
蔬菜接口:
package com.dai.factory.abstractfactory;
/**
*
* @author戴礼明
*日期: 2016-6-4
*content:蔬菜接口
*/
public interface Vegetables {
public void getName();
}
橘子:
package com.dai.factory.abstractfactory;
/**
*
* @author戴礼明
*日期: 2016-6-4
*content:橘子具体实现类
*/
public class Orange implements Fruits{
public void fruitsName() {
System.out.println("工厂生产了橘子");
}
}
香蕉:
package com.dai.factory.abstractfactory;
/**
*
* @author戴礼明
*日期: 2016-6-4
*content:香蕉具体实现类
*/
public class Banana implements Fruits{
public void fruitsName() {
System.out.println("生产的是香蕉");
}
}
土豆:
package com.dai.factory.abstractfactory;
/**
*
* @author戴礼明
*日期: 2016-4-22
*content:土豆
*/
public class Potato implements Vegetables{
public void getName() {
System.out.println("工厂生产了土豆!");
}
}
西红柿:
package com.dai.factory.abstractfactory;
/**
*
* @author戴礼明
*日期: 2016-6-3
*content:西红柿
*/
public class Tomato implements Vegetables{
public void getName() {
System.out.println("工厂生产了西红柿!");
}
}
工厂接口:
package com.dai.factory.abstractfactory;
/**
*
* @author戴礼明
*日期: 2016-6-4
*content:工厂接口
*/
public interface Factory {
public Fruits friutsFactory();
public VegetablesVegetablesFactory();
}
工厂A:
package com.dai.factory.abstractfactory;
/**
*
* @author戴礼明
*日期: 2016-6-4
*content:工厂A生产香蕉,土豆
*/
public class FactoryA implements Factory{
public Fruits friutsFactory() {
return new Banana();
}
public Vegetables VegetablesFactory() {
return new Potato();
}
}
工厂B:
package com.dai.factory.abstractfactory;
/**
*
* @author戴礼明
*日期: 2016-6-4
*content:工厂B生产橘子,西红柿
*/
public class FactoryB implements Factory{
public Fruits friutsFactory() {
return new Orange();
}
public Vegetables VegetablesFactory() {
return new Tomato();
}
}
测试:
package com.dai.factory.abstractfactory;
/**
*
* @author戴礼明
*日期: 2016-6-4
*content:抽象工厂测试方法
*/
public class TestAbstractFactory {
public static void main(String[] args) {
Factory factory=new FactoryB();
factory.friutsFactory().fruitsName();
factory.VegetablesFactory().getName();
}
}
总结:
抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。