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、生成不同操作系统的程序。

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

 

 

posted @ 2020-09-21 19:23  码在江湖  阅读(131)  评论(0编辑  收藏  举报