前言:在网上了解了下抽象工厂模式,自己也动手写了抽象工厂模式的代码。然而抽象工厂模式确实比较抽象。我的理解可能不到位,下面的个人理解要是有不对的地方,欢迎指正,还希望不要误导了大家。
意义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
使用场景:当一个事物拥有多个属性,而每一个属性又是可以进一步进行抽象的。顾名思义,“抽象工厂模式”对于工厂也进行了抽象,也就是说,工厂也是一个接口。需要其他的方式获取到这个工厂,进而获取工厂中的产品(比如具体的属性)。获取工厂需要一个工具,一般会定义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