【设计模式系列】--抽象工厂
2016-10-03 16:21
405 查看
在前面中,介绍过工厂方法模式,那么抽象工厂和工厂方法模式有哪些不一样呢?抽象工厂又可以解决什么样的问题呢?她在实际应用中又是如何发挥她的作用呢?今天这篇博文小编来主要简单的介绍一下抽象工厂模式,希望对有需要的小伙伴有帮助,不足之处,还请小伙伴多多指教。首先,我们来看一下什么是抽象工厂模式:
什么是抽象工厂?
抽象工厂模式是所有形态的工厂模式中最为抽象和最具其一般性的,抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。简单来说就是,抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。以之前的demo为例,拷贝Apple、Banana、Fruit,并且修改Apple和Banana的代码部分,如下所示,首先修改Apple的代码部分:
public abstract class Apple implements Fruit {
/**
* 采集
*/
public abstract void get();
}
Banana的代码部分,如下所示:public abstract class Banana implements Fruit {
/**
* 采集
*/
public abstract void get();
}
新建类NorthApple并继承Apple,编写代码如下所示:public class NorthApple extends Apple {
@Override
public void get() {
System.out.println("采集北方苹果");
}
}
同样新建南方苹果类SouthApple,继承Apple类,并编写相关的代码部分,如下所示:public class SouthApple extends Apple {
@Override
public void get() {
System.out.println("采集南方苹果");
}
}
同样新建NorthBanana和SouthBanana,代码类似NorthApple和SouthBanana,小编在这里就不一一进行介绍了,接着新建类FruitFactory,编写相关的代码部分,如下所示:public interface FruitFactory {
//实例化Apple
public Fruit getApple();
//实例化Banana
public Fruit getBanana();
}
新建类NorthFruitFactory,编写相关代码部分,如下所示:public class NorthFruitFactory implements FruitFactory {
@Override
public Fruit getApple() {
return new NorthApple();
}
@Override
public Fruit getBanana() {
return new NorthBanana();
}
}
同样的需要新建SouthFruitFactory,代码部分和NorthFruitFactory类似,不在赘述,新建类,MainClass,编写相关代码如下所示:
添加类WenshiApple类,并继承Apple类,编写代码如下所示:
public class WenshiApple extends Apple {
@Override
public void get() {
System.out.println("采集温室苹果");
}
}
同样的编写WenshiBanana,并继承Banana,编写相关代码和上述类似。 接着创建WenshiFruitFactory并实现FruitFactory,编写相关代码部分,如下所示:
public class WenshiFruitFactory implements FruitFactory {
@Override
public Fruit getApple() {
return new WenshiApple();
}
@Override
public Fruit getBanana() {
return new WenshiBanana();
}
}
编写MainClass里面的代码部分,如下所示:public class MainClass {
public static void main(String[] args){
FruitFactory ff = new NorthFruitFactory();
Fruit apple = ff.getApple();
apple.get();
Fruit banana = ff.getBanana();
banana.get();
FruitFactory ff2 = new SouthFruitFactory();
Fruit apple2 = ff2.getApple();
apple2.get();
Fruit banana2 = ff2.getBanana();
banana2.get();
FruitFactory ff3 = new WenshiFruitFactory();
Fruit apple3 = ff3.getApple();
apple3.get();
Fruit banana3 = ff3.getBanana();
banana3.get();
}
}
我们来看一下运行效果,如下所示:
模式中包含的角色及其职责
抽象工厂(Creator)角色
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
具体工厂(Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
抽象(Product)角色
抽象模式所创建的所有对象的父类,她负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
抽象模式所创建的具体实例对象
小编寄语:该博文,小编主要介绍了抽象工厂,结合之前学习过的模式,我们发现无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
什么是抽象工厂?
抽象工厂模式是所有形态的工厂模式中最为抽象和最具其一般性的,抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。简单来说就是,抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。以之前的demo为例,拷贝Apple、Banana、Fruit,并且修改Apple和Banana的代码部分,如下所示,首先修改Apple的代码部分:
public abstract class Apple implements Fruit {
/**
* 采集
*/
public abstract void get();
}
Banana的代码部分,如下所示:public abstract class Banana implements Fruit {
/**
* 采集
*/
public abstract void get();
}
新建类NorthApple并继承Apple,编写代码如下所示:public class NorthApple extends Apple {
@Override
public void get() {
System.out.println("采集北方苹果");
}
}
同样新建南方苹果类SouthApple,继承Apple类,并编写相关的代码部分,如下所示:public class SouthApple extends Apple {
@Override
public void get() {
System.out.println("采集南方苹果");
}
}
同样新建NorthBanana和SouthBanana,代码类似NorthApple和SouthBanana,小编在这里就不一一进行介绍了,接着新建类FruitFactory,编写相关的代码部分,如下所示:public interface FruitFactory {
//实例化Apple
public Fruit getApple();
//实例化Banana
public Fruit getBanana();
}
新建类NorthFruitFactory,编写相关代码部分,如下所示:public class NorthFruitFactory implements FruitFactory {
@Override
public Fruit getApple() {
return new NorthApple();
}
@Override
public Fruit getBanana() {
return new NorthBanana();
}
}
同样的需要新建SouthFruitFactory,代码部分和NorthFruitFactory类似,不在赘述,新建类,MainClass,编写相关代码如下所示:
public class MainClass { public static void main(String[] args){ FruitFactory ff = new NorthFruitFactory(); Fruit apple = ff.getApple(); apple.get(); Fruit banana = ff.getBanana(); banana.get(); FruitFactory ff2 = new SouthFruitFactory(); Fruit apple2 = ff2.getApple(); apple2.get(); Fruit banana2 = ff2.getBanana(); banana2.get(); } }接着,我们来运行一下,效果如下所示:
添加类WenshiApple类,并继承Apple类,编写代码如下所示:
public class WenshiApple extends Apple {
@Override
public void get() {
System.out.println("采集温室苹果");
}
}
同样的编写WenshiBanana,并继承Banana,编写相关代码和上述类似。 接着创建WenshiFruitFactory并实现FruitFactory,编写相关代码部分,如下所示:
public class WenshiFruitFactory implements FruitFactory {
@Override
public Fruit getApple() {
return new WenshiApple();
}
@Override
public Fruit getBanana() {
return new WenshiBanana();
}
}
编写MainClass里面的代码部分,如下所示:public class MainClass {
public static void main(String[] args){
FruitFactory ff = new NorthFruitFactory();
Fruit apple = ff.getApple();
apple.get();
Fruit banana = ff.getBanana();
banana.get();
FruitFactory ff2 = new SouthFruitFactory();
Fruit apple2 = ff2.getApple();
apple2.get();
Fruit banana2 = ff2.getBanana();
banana2.get();
FruitFactory ff3 = new WenshiFruitFactory();
Fruit apple3 = ff3.getApple();
apple3.get();
Fruit banana3 = ff3.getBanana();
banana3.get();
}
}
我们来看一下运行效果,如下所示:
模式中包含的角色及其职责
抽象工厂(Creator)角色
抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
具体工厂(Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
抽象(Product)角色
抽象模式所创建的所有对象的父类,她负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
抽象模式所创建的具体实例对象
小编寄语:该博文,小编主要介绍了抽象工厂,结合之前学习过的模式,我们发现无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
相关文章推荐
- 抽象工厂方法——设计模式系列
- [Java] 设计模式之工厂系列 02-面向抽象编程 抽象工厂 - 缺点 : 产生新的产品品种的时候,改动太多
- 抽象工厂方法——设计模式系列
- 设计模式系列10---高度定制的抽象工厂方法模式
- 设计模式系列之 抽象工厂
- [Java] 设计模式之工厂系列 02-面向抽象编程 抽象工厂 - 缺点 : 产生新的产品品种的时候,改动太多
- 3.偏头痛杨的常见设计模式入门系列之工厂模式篇(简单+方法+抽象)
- 设计模式系列之-抽象工厂
- 程序员的偷懒 -- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 学习笔记系列之NET设计模式(3):工厂方法(Factory Method)
- AbstractFactory抽象工厂设计模式
- 设计模式--抽象工厂
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- Abstract Factory 抽象工厂设计模式
- 设计模式-----抽象工厂
- 设计模式3:抽象工厂
- 设计模式 之 抽象工厂
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂