设计模式
设计模式之工厂模式
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+",是圆的!"); } }
食物工厂类:
1 package com.dai.factory.simplefactory; 2 /** 3 * 4 * @author戴礼明 5 *日期: 2016-6-3 6 *content:食物工厂类 7 */ 8 public class FoodFactory { 9 10 /** 11 * 创建食物 12 * @param object 13 * @return 14 */ 15 16 public Food createFood(String object){ 17 if("potato".equals(object)){ 18 return new Potato("土豆"); 19 }else if("tomato".equals(object)){ 20 return new Tomato("西红柿"); 21 } 22 return null; 23 } 24 25 }
测试类:
1 package com.dai.factory.simplefactory; 2 3 /** 4 * 5 * @author 戴礼明 6 *日期: 2016-6-3 7 *content:简单工厂测试 8 */ 9 public class SimpleFactory { 10 11 public static void main(String[] args) { 12 FoodFactory factory=new FoodFactory(); 13 14 Food t=factory.createFood("tomato"); 15 t.color(); 16 Food t1=factory.createFood("potato"); 17 t1.color(); 18 } 19 20 }
2. 工厂方法
说明:
一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。
即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。“一对一”的关系。
UML图如下所示:
食物接口:
1 package com.dai.factory.factorymethod; 2 3 /** 4 * 5 * @author 戴礼明 6 *日期: 2016-4-22 7 *content:食物接口 8 */ 9 public interface Food { 10 11 public void color(); 12 13 public void shape(); 14 15 }
土豆类的实现:
1 package com.dai.factory.factorymethod; 2 3 /** 4 * 5 * @author戴礼明 6 *日期: 2016-4-22 7 *content:食物接口 8 */ 9 public interface Food { 10 11 public void color(); 12 13 public void shape(); 14 15 } 16
西红柿类的实现:
1 package com.dai.factory.factorymethod; 2 3 /** 4 * 5 * @author戴礼明 6 *日期: 2016-4-22 7 *content:食物接口 8 */ 9 public interface Food { 10 11 public void color(); 12 13 public void shape(); 14 15 } 16
抽象工厂接口:
1 package com.dai.factory.factorymethod; 2 3 /** 4 * 5 * @author戴礼明 6 *日期: 2016-4-22 7 *content:食物接口 8 */ 9 public interface Food { 10 11 public void color(); 12 13 public void shape(); 14 15 }
土豆工厂:
1 package com.dai.factory.factorymethod; 2 /** 3 * 4 * @author戴礼明 5 *日期: 2016-6-3 6 *content:食物工厂类 7 */ 8 public class PotatoFactoryimplements Factory{ 9 10 /** 11 * 创建食物 12 * @param object 13 * @return 14 */ 15 public Food createFood(){ 16 return new Potato(); 17 } 18 19 } 20
西红柿工厂:
1 package com.dai.factory.factorymethod; 2 /** 3 * 4 * @author 戴礼明 5 *日期: 2016-6-3 6 *content:食物工厂类 7 */ 8 public class TomatoFactory implements Factory{ 9 10 /** 11 * 创建食物 12 * @param object 13 * @return 14 */ 15 public Food createFood(){ 16 return new Tomato(); 17 } 18 19 }
测试类:
1 package com.dai.factory.factorymethod; 2 3 4 /** 5 * 6 * @author戴礼明 7 *日期: 2016-6-3 8 *content:工厂方法测试 9 */ 10 public class SimpleFactory { 11 12 public static void main(String[] args) { 13 // Factory factory=new TomatoFactory(); 14 Factory factory=new PotatoFactory(); 15 factory.createFood().color(); 16 17 } 18 19 }
3. 抽象工厂
说明:抽象工厂模式也有四种角色:抽象工厂、具体工厂、抽象产品和具体产品
UML图如下所示:
代码如下所示:
水果接口:
1 package com.dai.factory.abstractfactory; 2 3 /** 4 * 5 * @author戴礼明 6 *日期: 2016-6-3 7 *content:水果抽象类 8 */ 9 public interface Fruits { 10 11 public void fruitsName(); 12 13 }
蔬菜接口:
1 package com.dai.factory.abstractfactory; 2 3 /** 4 * 5 * @author戴礼明 6 *日期: 2016-6-4 7 *content:蔬菜接口 8 */ 9 public interface Vegetables { 10 11 public void getName(); 12 13 }
橘子:
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("生产的是香蕉"); } }
土豆:
1 package com.dai.factory.abstractfactory; 2 3 /** 4 * 5 * @author戴礼明 6 *日期: 2016-4-22 7 *content:土豆 8 */ 9 public class Potato implements Vegetables{ 10 11 public void getName() { 12 System.out.println("工厂生产了土豆!"); 13 } 14 15 }
西红柿:
1 package com.dai.factory.abstractfactory; 2 3 4 /** 5 * 6 * @author戴礼明 7 *日期: 2016-6-3 8 *content:西红柿 9 */ 10 public class Tomato implements Vegetables{ 11 12 13 public void getName() { 14 System.out.println("工厂生产了西红柿!"); 15 } 16 17 18 19 20 }
工厂接口:
package com.dai.factory.abstractfactory; /** * * @author戴礼明 *日期: 2016-6-4 *content:工厂接口 */ public interface Factory { public Fruits friutsFactory(); public VegetablesVegetablesFactory(); }
工厂A:
1 package com.dai.factory.abstractfactory; 2 /** 3 * 4 * @author戴礼明 5 *日期: 2016-6-4 6 *content:工厂A生产香蕉,土豆 7 */ 8 9 public class FactoryA implements Factory{ 10 11 public Fruits friutsFactory() { 12 return new Banana(); 13 } 14 15 public Vegetables VegetablesFactory() { 16 return new Potato(); 17 } 18 19 20 21 } 22
工厂B:
1 package com.dai.factory.abstractfactory; 2 3 /** 4 * 5 * @author戴礼明 6 *日期: 2016-6-4 7 *content:工厂B生产橘子,西红柿 8 */ 9 public class FactoryB implements Factory{ 10 11 public Fruits friutsFactory() { 12 return new Orange(); 13 } 14 15 public Vegetables VegetablesFactory() { 16 return new Tomato(); 17 } 18 19 20 21 }
测试:
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(); } }
总结:
抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。

浙公网安备 33010602011771号