抽象工厂模式和工厂方法模式详解

前言:两种设计模式有什么区别???先看代码实现,再细说它们的区别。

抽象工厂模式

       主要角色:

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

结构图:

 

 代码实现:

//抽象工厂接口
public interface AbstractFactory {

     void product1();
     void product2();
}

//工厂A
public class FactroyA implements AbstractFactory {
    @Override
    public void product1() {
        System.out.println("生产A:product1");
    }
   @Override
    public void product2() {
        System.out.println("生产A:product2");
    }
}

//工厂B
public class FactroyB implements AbstractFactory {
    @Override
    public void product1() {
        System.out.println("生产B:product1");
    }
 @Override
    public void product2() {
        System.out.println("生产B:product2");
    }
}

//用户工厂
public class RealFactory {
   public AbstractFactory getFactory(String type){
       if("A".equals(type)){
           return new FactroyA();
       }else if("B".equals(type)){
           return new FactroyB();
       }
       return null;
   };
}

//测试

public class TestAbstractFactory {
    public static void main(String[] args) {
        RealFactory realFactory = new RealFactory();
        AbstractFactory a = realFactory.getFactory("A");
        //代码没有生产产品,只是打印除了生产记录
        a.product1();
    }
}

 

工厂方法模式

         主要角色:和上面抽象工厂的角色大致一样。

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
  2. 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

结构图

代码实现

//抽象产品:提供了产品的接口
interface Product
{
    public void show();
}
//具体产品1:实现抽象产品中的抽象方法
class ConcreteProduct1 implements Product
{
    public void show()
    {
        System.out.println("具体产品1显示...");
    }
}
//具体产品2:实现抽象产品中的抽象方法
class ConcreteProduct2 implements Product
{
    public void show()
    {
        System.out.println("具体产品2显示...");
    }
}
//抽象工厂:提供了厂品的生成方法
interface AbstractFactory
{
    public Product newProduct();
}
//具体工厂1:实现了厂品的生成方法
class ConcreteFactory1 implements AbstractFactory
{
    public Product newProduct()
    {
        System.out.println("具体工厂1生成-->具体产品1...");
        return new ConcreteProduct1();
    }
}
//具体工厂2:实现了厂品的生成方法
class ConcreteFactory2 implements AbstractFactory
{
    public Product newProduct()
    {
        System.out.println("具体工厂2生成-->具体产品2...");
        return new ConcreteProduct2();
    }
}

          

总结:抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。

                        工厂方法模式:
                         一个抽象产品类,可以派生出多个具体产品类。
                         一个抽象工厂类,可以派生出多个具体工厂类。
                        每个具体工厂类只能创建一个具体产品类的实例。

                        抽象工厂模式:
                        多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
                        一个抽象工厂类,可以派生出多个具体工厂类。
                        每个具体工厂类可以创建多个具体产品类的实例。

                        区别:
                        工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
                        工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

 

posted @ 2019-08-09 15:24  Don'tYouSee  阅读(561)  评论(0)    收藏  举报