首先 ,想要理解抽象工厂模式首先要理解简单工厂模式和工厂模式!
概念:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
有以下角色组成:
抽象工厂类
具体工厂类
抽象产品类
具体产品类
与工厂方法的区别在于:
在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
注意一点:在写代码的时候围绕着抽象工厂的四个角色进行,所有的类中除了客户的输出类外必然属于四个角色中的一个:
抽象工厂类
具体工厂类
抽象产品类
具体产品类
若是理解完之后咋们直接上代码:
抽象工厂测试:
目前有以下两个个品牌 nike adidas
大家都有 衣服(clothes)和鞋子(shoes) 的产品 例如: nike衣服 nike鞋子
请使用抽象工厂写出上述的内容(不需要顾客类),并给每个关键的模块 备注好,具体是什么模块 例如:具体产品是哪个类
package com.java.textfactory;
/**
* 客户输出类
* @author Think
*
*/
public class Client {
public static void main(String[] args) {
//买一件Nike的衣服
Factory factory=new Clothes();//先找到卖衣服的商店
Nike nike=factory.buyNike();//再找到商店里Nike的品牌
nike.show();//得到耐克的衣服
//买一件Nike鞋子也是同样的原理
Factory factory2=new Shoes();//找到到卖鞋子的商店
Nike nike2=factory2.buyNike();//找到商店里Nike的品牌鞋子
nike2.show();//输出Nike鞋子
}
}
package com.java.textfactory;
/**
* 阿迪达斯品牌
* 抽象产品
* @author Think
*
*/
public interface Adidas {
void show();
}
package com.java.textfactory;
/**
*阿迪达斯的鞋子
*具体产品类
* @author Think
*
*/
public class Adidasshoes implements Adidas {
@Override
public void show() {
System.out.println("adidas鞋子");
}
}
package com.java.textfactory;
/**
* 阿迪达斯的衣服
* 具体产品类
* @author Think
*
*/
public class Adidasclothes implements Adidas{
@Override
public void show() {
System.out.println("Adidas衣服");
}
}
package com.java.textfactory;
/**
* 耐克品牌
* 抽象产品类
* @author Think
*
*/
public interface Nike {
void show();
}
package com.java.textfactory;
/**
* 耐克的鞋子
* 具体产品类
* @author Think
*
*/
public class Nikeshoes implements Nike{
@Override
public void show() {
System.out.println("耐克鞋子");
}
}
package com.java.textfactory;
/**
* 耐克衣服
* 具体产品类
* @author Think
*
*/
public class Nikeclothes implements Nike{
@Override
public void show() {
System.out.println("耐克衣服");
}
}
package com.java.textfactory;
/**
* 商店
* 抽象工厂类
*
* @author Think
*
*/
public interface Factory{
Nike buyNike();
Adidas buyAdidas();
}
package com.java.textfactory;
/**
* 衣服工厂
* 具体工厂类
* @author Think
*
*/
public class Clothes implements Factory{
@Override
public Nike buyNike() {
return new Nikeclothes();
}
@Override
public Adidas buyAdidas() {
return new Adidasclothes();
}
}
package com.java.textfactory;
/**
* 鞋子工厂
* 具体工厂类
* @author Think
*
*/
public class Shoes implements Factory{
@Override
public Nike buyNike() {
return new Nikeshoes();
}
@Override
public Adidas buyAdidas() {
return new Adidasshoes();
}
}