欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【学习设计模式】简单工厂、工厂模式、抽象工厂模式

程序员文章站 2024-01-21 20:27:04
...

抽象工厂模式的优点

抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

抽象工厂模式的缺点

产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的

工厂设计模式适用范围:
当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式

比较简单直接上代码:

定义三个接口和其实现类,解释在注释中

/**
 * @author Jay
 * @date 2020/7/15 15:29
 * @Description:
 */
public interface Product {
}

/**
 * @author Jay
 * @date 2020/7/15 15:45
 * @Description:
 */
public interface Gift {
}
/**
 * @author Jay
 * @date 2020/7/15 15:32
 * @Description:
 * 工厂模式:
 * 中心思想:把工厂抽象化,有多少产品建多少工厂。满足开闭原则
 * 抽象工厂模式:工厂模式的基础上,一个工厂多人使用,但是一个工厂最好是生产隶属于某族的产品比如说A族。
 * 当A族产品只有Product时,抽象工厂退化为工厂模式
 */
public interface Factory {
    public Product createProduct();
    public  Gift createGift();
}

/**
 * @author Jay
 * @date 2020/7/15 15:24
 * @Description:
 */
public class ProductA implements Product {
    public ProductA(){
        System.out.println("生产产品A");
    }
}

/**
 * @author Jay
 * @date 2020/7/15 15:25
 * @Description:
 */
public class ProductB implements Product{
    public ProductB(){
        System.out.println("生产产品B");
    }
}

/**
 * @author Jay
 * @date 2020/7/15 15:46
 * @Description:
 */
public class GiftA implements Gift{
    public GiftA(){
        System.out.println("礼物A");
    }
}
/**
 * @author Jay
 * @date 2020/7/15 15:46
 * @Description:
 */
public class GiftB implements Gift {
    public GiftB(){
        System.out.println("礼物");
    }
}

/**
 * @author Jay
 * @date 2020/7/15 15:25
 * @Description:
 * 中心思想:只抽象产品,工厂只有一个,每生产新产品都需要在改写工厂的代码。不满足开闭原则。
 */
public class EasyFactory {
    public static Product create(String str){
        if (str.equals("ProductA"))
            return new ProductA();
        if (str.equals("ProductB"))
            return new ProductB();

        return null;
    }
}
/**
 * @author Jay
 * @date 2020/7/15 15:32
 * @Description:
 */
public class FactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }

    @Override
    public Gift createGift() {
        return new GiftA();
    }
}

/**
 * @author Jay
 * @date 2020/7/15 15:32
 * @Description:
 */
public class FactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }

    @Override
    public Gift createGift() {
        return new GiftB();
    }
}