package com.demo.factory.model;
/*
* 抽象产品
*/
public abstract class AbstractFruit {
//水果名字
public String name ="";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
工厂模式,则一定要有工厂,工厂要生产产品,所以一定要有生产产品的方法,而且返回类型是产品,如下。
package com.demo.factory.itf;
import com.demo.factory.model.AbstractFruit;
/*
* 抽象水果工厂,生产抽象类
*/
public interface IFruit {
public AbstractFruit createFruit();
}
</pre><pre name="code" class="java">package com.demo.factory.model.object;
import com.demo.factory.model.AbstractFruit;
/*
* 具体产品
*/
public class Apple extends AbstractFruit {
public Apple() {
this.name = "苹果";
}
}
package com.demo.factory;
import com.demo.factory.itf.IFruit;
import com.demo.factory.model.AbstractFruit;
import com.demo.factory.model.object.Apple;
/*
*具体水果工厂 ,生产具体水果
*/
public class AppleFactory implements IFruit {
@Override
public AbstractFruit createFruit() {
return new Apple();
}
}
package com.demo.factory.test;
import com.demo.factory.FruitFactory;
import com.demo.factory.itf.IFruit;
import com.demo.factory.model.AbstractFruit;
public class MainApp {
public static void main(String arsg[]){
IFruit ff = new AppleFactory();
AbstractFruit af= ff.createFruit();
System.out.println("生产的水果是"+af.getName());
}
}
测试结果:生产的水果是苹果。
生产的产品不依赖于抽象类或者抽象产品,如果有新的产品比如梨,仅仅需要增加Pear.java和PearFactory.java即可。
package com.demo.factory.model.object;
import com.demo.factory.model.AbstractFruit;
public class Pear extends AbstractFruit {
public Pear() {
this.setName("梨");
}
}
public class PearFactory implements IFruit{
/* (non-Javadoc)
* @see com.prac.util.abstractfac.IFruit#createFruit()
*/
@Override
public AbstractFruit createFruit() {
// TODO Auto-generated method stub
return new Pear();
}
}
测试类:
public class MainApp {
public static void main(String arsg[]){
IFruit ff = new AppleFactory();
AbstractFruit af= ff.createFruit();
System.out.println("生产的水果是"+af.getName());
IFruit ff2 = new PearFactory();
AbstractFruit af2= ff2.createFruit();
System.out.println("生产的水果是"+af2.getName());
}
}
输出:
生产的水果是苹果
生产的水果是梨
*在工厂方法模式中,存在这样几个角色:
(1)抽象工厂
(2)抽象产品
(3)具体工厂
(4)具体产品
可以这样理解工厂模式:
抽象工厂生产抽象产品(IFruit生产AbstractFruit),具体工厂生产具体产品(AppleFactory生产Apple)。
扩展:arraylist 和 linklist 就是list的实现类,它们的设计也是应用了工厂模式,
list中定义了一个iterator()的方法,返回一个iterator 的抽象产品,用来遍历list中各个对象。