工厂模式—抽象工厂

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中各个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值