介绍
抽象工厂模式属于创建型模式,它在工厂模式基础上,又创建了一个创建工厂的超级工厂,对于有两个相互影响因素的业务有很大优势。
优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
应用
生成不同操作系统的程序,游戏中换皮肤与换皮肤颜色(炫彩皮肤/星元)
实现
//定义电影业务接口,实现爱情片、科幻片实体类
interface Movie {
void watch();
}
class Romance implements Movie {
@Override
public void watch() {
System.out.println("watch romance movie");
}
}
class Fiction implements Movie {
@Override
public void watch() {
System.out.println("watch fiction movie");
}
}
// 定义音乐业务接口,并且实现古典音乐、现代音乐实体类
interface Music {
void listen();
}
class Classical implements Music {
@Override
public void listen() {
System.out.println("listen classical music");
}
}
class Modern implements Music {
@Override
public void listen() {
System.out.println("listen modern music");
}
}
// 为movie、music对象创建抽象类来获取工厂
abstract class AbstractFactory {
public abstract Movie getMovie(String movie);
public abstract Music getMusic(String music);
}
class MovieFactory extends AbstractFactory{
//获取电影类型的对象
@Override
public Movie getMovie(String movie){
if(movie == null){
return null;
}
if(movie.equalsIgnoreCase("Romance")){
return new Romance();
} else if(movie.equalsIgnoreCase("Fiction")){
return new Fiction();
}
return null;
}
@Override
public Music getMusic(String music){
return null;
}
}
class MusicFactory extends AbstractFactory{
@Override
public Movie getMovie(String movie){
return null;
}
//获取音乐类型的对象
@Override
public Music getMusic(String music){
if(music == null){
return null;
}
if(music.equalsIgnoreCase("Classical")){
return new Classical();
} else if(music.equalsIgnoreCase("Modern")){
return new Modern();
}
return null;
}
}
//创建一个工厂生成类,通过选择电影、音乐来获取工厂
class FactoryProducer<T> {
public static <T> T getFactory(String choice){
if(choice.equalsIgnoreCase("Movie")){
return (T)new MovieFactory();
} else if(choice.equalsIgnoreCase("Music")){
return (T) new MusicFactory();
}
return null;
}
}
class FactoryDemo {
public static <T extends AbstractFactory> void main(String[] args) {
T t = (T)FactoryProducer.getFactory("movie");
Movie movie1 = t.getMovie("Romance");
movie1.watch();
T t1 = (T)FactoryProducer.getFactory("music");
Music music = t1.getMusic("Modern");
music.listen();
}
}
运行结果:
watch romance movie
listen modern music