设计模式之工厂模式

设计模式之工厂模式

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();
    }
   
   
}

 总结:

抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值