抽象工厂模式

前言在网上了解了下抽象工厂模式,自己也动手写了抽象工厂模式的代码。然而抽象工厂模式确实比较抽象。我的理解可能不到位,下面的个人理解要是有不对的地方,欢迎指正,还希望不要误导了大家

意义提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

使用场景当一个事物拥有多个属性,而每一个属性又是可以进一步进行抽象的。顾名思义,“抽象工厂模式”对于工厂也进行了抽象,也就是说,工厂也是一个接口。需要其他的方式获取到这个工厂,进而获取工厂中的产品(比如具体的属性)。获取工厂需要一个工具,一般会定义FactoryProducer来产生不同类型的工厂。

简而言之:先通过FactoryProducer获取特定类型的工厂,拿到工厂后,再获取工厂中的产品。

下面的例子是关于蔬菜的,蔬菜有味道(taste),也有颜色(color)。而味道和颜色是抽象的。

关于蔬菜的颜色:

public interface Color {
     void look();
}
public class Green implements Color {
	@Override
	public void look() {
		System.out.println("this color is green ");

	}
}
public class Red implements Color {
	@Override
	public void look() {
		System.out.println("this color is red ");

	}
}
public class Yellow implements Color {
	@Override
	public void look() {
		System.out.println("this color is yellow ");

	}
}

关于蔬菜的口味:

public interface Taste {
  void tastes();
}
//苦的
public class Bitter implements Taste {
	@Override
	public void tastes() {
		System.out.println("this tastes bitter ");

	}
}
//酸的
public class Sour implements Taste {
	@Override
	public void tastes() {
		System.out.println("this tastes sour ");
	}
}
/**
 * 甜的
 * @author admin
 *
 */
public class Sweet implements Taste {
	@Override
	public void tastes() {
		System.out.println("this tastes sweet ");
	}

}

创建一个抽象的工厂,该工厂可以获取具体的工厂,比如Color和Taste的工厂;

public interface AbstractFactory {
     Color getColor(String color);
     Taste getTaste(String taste);
}
/**
 * Color的工厂
 */
public class ColorFactory implements AbstractFactory{
	public Color getColor(String color){
		if(color==null){
			return null;
		}else if(color.equalsIgnoreCase("yellow")){
			return new Yellow();
		}else if(color.equalsIgnoreCase("red")){
			return new Red();
		}else if(color.equalsIgnoreCase("green")){
			return new Green();
		}else{
			return null;
		}
	}

	@Override
	public Taste getTaste(String taste) {
		// TODO Auto-generated method stub
		return null;
	}
}
/**
 * Taste的工厂
 */
public class TasteFactory implements AbstractFactory {
	
	public Taste getTaste(String taste){
		if(taste==null){
			return null;
		}else if(taste.equalsIgnoreCase("bitter")){
			return new Bitter();
		}else if(taste.equalsIgnoreCase("sweet")){
			return new Sweet();
		}else if(taste.equalsIgnoreCase("sour")){
			return new Sour();
		}else{
			return null;
		}
	}

	@Override
	public Color getColor(String color) {
		// TODO Auto-generated method stub
		return null;
	}

}

对工厂本身进行抽象

/**
 * 工厂生成器。根据传入工厂的名称,返回对应的工厂。可以理解为对工厂本身也进行了抽象
 * @author admin
 *
 */
public class FactoryProducer {
	public static AbstractFactory getFactory(String type){
		if(type==null){
			return null;
		}else if(type.equalsIgnoreCase("color")){
			return new ColorFactory();
		}else if(type.equalsIgnoreCase("taste")){
			return new TasteFactory();
		}else{
			return null;
		}
	}
}

主方法:

public class Main {

	public static void main(String[] args) {
		Color color1=FactoryProducer.getFactory("color").getColor("red");
		Color color2=FactoryProducer.getFactory("color").getColor("green");
		Color color3=FactoryProducer.getFactory("color").getColor("yellow");
		color1.look();
		color2.look();
		color3.look();
		
		Taste taste1=FactoryProducer.getFactory("taste").getTaste("bitter");
		Taste taste2=FactoryProducer.getFactory("taste").getTaste("sour");
		Taste taste3=FactoryProducer.getFactory("taste").getTaste("sweet");
		taste1.tastes();
		taste2.tastes();
		taste3.tastes();
	}
}

运行结果:

this color is red 
this color is green 
this color is yellow 
this tastes bitter 
this tastes sour 
this tastes sweet 









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值