设计模式(三):抽象工厂模式

111 阅读2分钟

介绍

抽象工厂模式属于创建型模式,它在工厂模式基础上,又创建了一个创建工厂的超级工厂,对于有两个相互影响因素的业务有很大优势。

优点

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点

产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 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