• java23种设计模式-创建者模式-抽象工厂模式


    一、定义

      抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

      在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

    二、优点及缺点

    优点: 

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

    缺点:

     2、产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

    三、代码实现:

     水果抽象类:

    /**
     *  @author: wsq
     *  @Date: 2020/9/18 14:38
     *  @Description: 水果接口
     */
    public interface Fruit {
        public void printName();
    }

    水果的两个实现类:

    public class Apple implements Fruit {
        @Override
        public void printName() {
            System.out.println("This is apple!!!");
        }
    }
    
    public class Banana implements Fruit {
        @Override
        public void printName() {
            System.out.println("This is banana!!!");
        }
    }

    图形抽象类:

    /**
     *  @author: wsq
     *  @Date: 2020/9/21 19:17
     *  @Description: 图形抽象类
     */
    public interface Shape {
        public void printShape();
    }

    图形的两个实现类:

    public class Square implements Shape{
        @Override
        public void printShape() {
            System.out.println("This is square!!!");
        }
    }
    
    
    public class Circle implements Shape{
        @Override
        public void printShape() {
            System.out.println("This is circle!!!");
        }
    }

    图形和水果的抽象工厂类:

    /**
     *  @author: wsq
     *  @Date: 2020/9/18 15:00
     *  @Description: 抽象工厂
     */
    public abstract class AbstactFactory {
        public abstract Shape getShape(String name);
        public abstract Fruit getFruit(String name);
    }

    图形和水果的工厂类:

    /**
     *  @author: wsq
     *  @Date: 2020/9/21 19:19
     *  @Description: 水果的工厂
     */
    public class FruitFactory extends AbstactFactory{
        @Override
        public Shape getShape(String name) {
            return null;
        }
    
        public Fruit getFruit(String name){
            if(name.equals("apple")){
                return new Apple();
            }
            if(name.equals("banana")){
                return new Banana();
            }
            return null;
        }
    }
    
    
    /**
     *  @author: wsq
     *  @Date:  14:57
     *  @Description: 图形的工厂
     */
    public class ShapeFactory extends AbstactFactory{
        public Shape getShape(String name){
            if(name.equals("circle")){
                return new Circle();
            }else if(name.equals("square")){
                return new Square();
            }
            return null;
        }
    
        @Override
        public Fruit getFruit(String name) {
            return null;
        }
    }

    工厂类:

    /**
     *  @author: wsq
     *  @Date: 2020/9/21 19:20
     *  @Description: 工厂类
     */
    public class FactoryProducer {
        public AbstactFactory getFactory(String name){
            if(name.equals("FruitFactory")){
                return new FruitFactory();
            }else if(name.equals("shapeFactory")){
                return new ShapeFactory();
            }
            return null;
        }
    }

    四、源码级别

    五、总结

    使用场景: 

      1、一组数据,一换就换一套。

      2、生成不同操作系统的程序。

    注意事项:产品族难扩展,产品等级易扩展。

     

  • 相关阅读:
    Codeforces Round #508 (Div. 2) C D
    Codeforces Round #493 (Div. 2)
    ACM-ICPC 2015 ChangChun
    ACM-ICPC 2015 BeiJing
    CodeFroces-- 514.div2.C-Sequence Transformation
    [Windows Server 2012] 网页Gzip压缩
    [Windows Server 2008] 安装网站伪静态
    [Windows Server 2003] 安装SQL Server 2005
    [Windows Server 2003] 安装PHP+MySQL方法
    [Windows Server 2003] IIS自带FTP安装及配置方法
  • 原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13707692.html
Copyright © 2020-2023  润新知