什么是抽象工厂模式?
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
抽象工厂模式使用场景
在生活中,我们经常去餐馆吃饭。比如,我们愿意吃鸡腿配上可乐,喜欢吃盖饭配蛋花汤。我们不关心鸡腿怎么做的,可乐怎么生产的,盖饭怎么炒的,而只关心我们吃什么,喝什么,我们只需要指定想要的搭配就可以了,这就是典型的抽象工厂。 后面会代码举例这个抽象工厂模式场景。
总结抽象工厂使用场景:
1 系统独立于它的产品创建、组合和表示。即无需关心内部对象时如何创建的,怎么创建的,什么含义。
2 系统需要多个产品组合中的一个配置。由于对象很多,能够组合出的组合非常多,而系统只是使用某一个组合。
3 强调的对象的组合结果,而不是他们具体的接口和实现。
抽象工厂模式意图
提供对象的使用接口,隐藏对象的创建过程。
抽象工厂模式角色
代码语言:javascript复制AbstractFactory 提供创建对象的接口。ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。AbstractProduct 提供对象的使用接口。ConcreteProduct 提供真正的适用对象,隐藏该对象的创建过程,是工厂创建的对象。Client 使用者,通过抽象工厂接口,使用不同的具体工厂方法创建对象组合,从而直接使用对象,无需关注对象的创建过程。
抽象工厂模式代码举例
抽象接口定义:
代码语言:javascript复制//抽象工厂-提供创建对象接口----主食 饮品 的抽象接口
public interface EatFacotry {
public StapleFood MakeStapleFood();
public Drinks MakeDrinks();
}
//主食接口--提供对象的使用接口
interface StapleFood{
public void eating();
}
//饮用接口--提供对象的使用接口
interface Drinks{
public void drinking();
}
创建真实的对象 工厂会隐藏他们的创建过程,就像我们只想吃 鸡腿 可乐 而不关系他们的制作过程一样:
代码语言:javascript复制//创建主食--鸡腿
class Drumsticks implements StapleFood{
public void eating() {
// TODO Auto-generated method stub
System.out.println("主食吃 鸡腿 鸡腿 鸡腿");
}
}
//创建主食--盖饭
class Rice implements StapleFood{
public void eating() {
// TODO Auto-generated method stub
System.out.println("主食吃 盖饭 盖饭 盖饭");
}
}
//创建主饮品--可乐
class Cola implements Drinks{
public void drinking() {
// TODO Auto-generated method stub
System.out.println("可乐 可乐 可乐 可乐");
}
}
//创建主饮品--鸡蛋汤
class EggdropSoup implements Drinks{
public void drinking() {
// TODO Auto-generated method stub
System.out.println(" 鸡蛋汤 鸡蛋汤 鸡蛋汤 鸡蛋汤");
}
}
提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。 创建 鸡腿 可乐
代码语言:javascript复制什么是抽象工厂模式?
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
抽象工厂模式使用场景
在生活中,我们经常去餐馆吃饭。比如,我们愿意吃鸡腿配上可乐,喜欢吃盖饭配蛋花汤。我们不关心鸡腿怎么做的,可乐怎么生产的,盖饭怎么炒的,而只关心我们吃什么,喝什么,我们只需要指定想要的搭配就可以了,这就是典型的抽象工厂。 后面会代码举例这个抽象工厂模式场景。
总结抽象工厂使用场景:
1 系统独立于它的产品创建、组合和表示。即无需关心内部对象时如何创建的,怎么创建的,什么含义。
2 系统需要多个产品组合中的一个配置。由于对象很多,能够组合出的组合非常多,而系统只是使用某一个组合。
3 强调的对象的组合结果,而不是他们具体的接口和实现。
抽象工厂模式意图
提供对象的使用接口,隐藏对象的创建过程。
抽象工厂模式角色
AbstractFactory 提供创建对象的接口。
ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。
AbstractProduct 提供对象的使用接口。
ConcreteProduct 提供真正的适用对象,隐藏该对象的创建过程,是工厂创建的对象。
Client 使用者,通过抽象工厂接口,使用不同的具体工厂方法创建对象组合,从而直接使用对象,无需关注对象的创建过程。
抽象工厂模式代码举例
抽象接口定义:
//抽象工厂-提供创建对象接口----主食 饮品 的抽象接口
public interface EatFacotry {
public StapleFood MakeStapleFood();
public Drinks MakeDrinks();
}
//主食接口--提供对象的使用接口
interface StapleFood{
public void eating();
}
//饮用接口--提供对象的使用接口
interface Drinks{
public void drinking();
}
创建真实的对象 工厂会隐藏他们的创建过程,就像我们只想吃 鸡腿 可乐 而不关系他们的制作过程一样:
//创建主食--鸡腿
class Drumsticks implements StapleFood{
public void eating() {
// TODO Auto-generated method stub
System.out.println("主食吃 鸡腿 鸡腿 鸡腿");
}
}
//创建主食--盖饭
class Rice implements StapleFood{
public void eating() {
// TODO Auto-generated method stub
System.out.println("主食吃 盖饭 盖饭 盖饭");
}
}
//创建主饮品--可乐
class Cola implements Drinks{
public void drinking() {
// TODO Auto-generated method stub
System.out.println("可乐 可乐 可乐 可乐");
}
}
//创建主饮品--鸡蛋汤
class EggdropSoup implements Drinks{
public void drinking() {
// TODO Auto-generated method stub
System.out.println(" 鸡蛋汤 鸡蛋汤 鸡蛋汤 鸡蛋汤");
}
}
提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。 创建 鸡腿 可乐
class ConcreteFactory1 implements EatFacotry{
//创建 主食 鸡腿
public StapleFood MakeStapleFood() {
// TODO Auto-generated method stub
return new Drumsticks();
}
//创建 饮品 可乐
public Drinks MakeDrinks() {
// TODO Auto-generated method stub
return new Cola();
}
}
//提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。 创建 盖饭 鸡蛋汤
class ConcreteFactory2 implements EatFacotry{
public StapleFood MakeStapleFood() {
// TODO Auto-generated method stub
return new Rice();
}
public Drinks MakeDrinks() {
// TODO Auto-generated method stub
return new EggdropSoup();
}
}
下面看下如何使用
public static void main(String[] args) {
//---------------鸡腿 可乐---------------
EatFacotry eat1 =new ConcreteFactory2();
eat1.MakeStapleFood().eating();
eat1.MakeDrinks().drinking();
}
这就是一个简单的抽象工厂的使用。
下面看下如何使用
代码语言:javascript复制public static void main(String[] args) {
//---------------鸡腿 可乐---------------
EatFacotry eat1 =new ConcreteFactory2();
eat1.MakeStapleFood().eating();
eat1.MakeDrinks().drinking();
}
这就是一个简单的抽象工厂的使用。