抽象工厂模式特点
抽象工厂模式与工厂模式最大的区别是每个单独的产品是一个工厂模式,而多个不同产品交互则是抽象工厂模式,抽象工厂模式通常要运用工厂模式的方法。通常,工厂模式的所有产品的创建都放在这个工厂里面,如果产品有所变更,则需要修改该工厂方法,违反了设计模式的开闭原则——对扩展开放,对修改关闭。而抽象工厂模式则认为当需要创建一个新的产品时,也创建一个新的工厂即可,不需要修改任何之前已有的代码。
抽象工厂案例图
从上图可以看出,如果要开发一个搜索的功能,而搜索功能又分为图片搜索和新闻搜索,图片搜索又可以再开发新功能,如风景图片搜索、明星图片搜索、动漫图片搜索;同样新闻搜索又可以再开发新功能,如文化新闻搜索、科技新闻搜索、经济新闻搜索。对于这样的一个强大的功能,可以使用抽象工厂模式,例如可以建一个搜索工厂,用于创建图片搜索和新闻搜索的接口,然后再定义两个小工厂,图片工厂和新闻工厂,实现搜索工厂这个接口,并且可以创建具体的搜索功能实例。
案例的具体代码实现
首先定义一个可搜索的接口,所有的被搜索对象均要实现这个接口,才可以被搜索到:
package com.factory.abstractFactory;
public interface Searchable {
public void get();
}
package com.factory.abstractFactory;
public interface SearchFactory {
public Searchable search();
}
图片搜索工厂
定义图片搜索的三个功能:
package com.factory.abstractFactory;
public class ViewPic implements Searchable {
@Override
public void get() {
System.out.println("风景图片搜索");
}
}
package com.factory.abstractFactory;
public class StarPic implements Searchable {
@Override
public void get() {
System.out.println("明星图片搜索");
}
}
package com.factory.abstractFactory;
public class AnimationPic implements Searchable {
@Override
public void get() {
System.out.println("动漫图片搜索");
}
}
package com.factory.abstractFactory;
public class ViewPicFactory implements SearchFactory {
@Override
public Searchable search() {
return new ViewPic();
}
}
package com.factory.abstractFactory;
public class StarPicFactory implements SearchFactory {
@Override
public Searchable search() {
return new StarPic();
}
}
package com.factory.abstractFactory;
public class AnimationPicFactory implements SearchFactory{
@Override
public Searchable search() {
return new AnimationPic();
}
}
新闻搜索工厂
定义新闻搜索的三个功能:
package com.factory.abstractFactory;
public class CultureNews implements Searchable{
@Override
public void get() {
System.out.println("文化新闻搜索");
}
}
package com.factory.abstractFactory;
public class TechNews implements Searchable {
@Override
public void get() {
System.out.println("科技新闻搜索");
}
}
package com.factory.abstractFactory;
public class EconomicNews implements Searchable{
@Override
public void get() {
System.out.println("经济新闻搜索");
}
}
package com.factory.abstractFactory;
public class CultureNewsFactory implements SearchFactory {
@Override
public Searchable search() {
return new CultureNews();
}
}
package com.factory.abstractFactory;
public class TechNewsFactory implements SearchFactory {
@Override
public Searchable search() {
return new TechNews();
}
}
package com.factory.abstractFactory;
public class EconomicNewsFactory implements SearchFactory {
@Override
public Searchable search() {
return new EconomicNews();
}
}
测试代码
package com.factory.abstractFactory;
public class Test {
public static void main(String[] args) {
//搜索风景图片
SearchFactory viewPicFactory = new ViewPicFactory();
Searchable search1 = viewPicFactory.search();
search1.get();
//搜索明星图片
SearchFactory starPicFactory = new StarPicFactory();
Searchable search2 = starPicFactory.search();
search2.get();
//搜索动漫图片
SearchFactory animationPicFactory = new AnimationPicFactory();
Searchable search3 = animationPicFactory.search();
search3.get();
//搜索科技新闻
SearchFactory techNewsFactory = new TechNewsFactory();
Searchable search4 = techNewsFactory.search();
search4.get();
//搜索经济新闻
SearchFactory economicNewsFactory = new EconomicNewsFactory();
Searchable search5 = economicNewsFactory.search();
search5.get();
//搜索文化新闻
SearchFactory cultureNewsFactory = new CultureNewsFactory();
Searchable search6 = cultureNewsFactory.search();
search6.get();
}
}
风景图片搜索
明星图片搜索
动漫图片搜索
科技新闻搜索
经济新闻搜索
文化新闻搜索
抽象工厂模式的适用性
上面的例子可以再次扩展,只用添加做一个功能实现类,并且实现Searchable接口,同时创建一个产品工厂即可,还可以进行产品之间功能的耦合。抽象工厂模式可以适用于一个系统独立于产品的创建组合和表示,或者只想提供一个产品类库的接口,不想提供实现的时候。
来源:oschina
链接:https://my.oschina.net/u/2315247/blog/489761