0-前言

  简单工厂、工厂方法、抽象工厂都是创建型的设计模式,三个设计模式都是工厂的变种,不复杂,下面我们来快速学习这三种;

1-简单工厂模式

  太简单,UML图就不画了,直接上代码:

//-----------------1、简单工厂------------
//1-1、生产者父类
class PhoneMaker
{
    public void  getPhone(){}
}
//1-2、具体生产者
class IphoneMaker extends PhoneMaker
{
    @Override
    public void getPhone()
    {
        System.out.println("生产出了苹果手机");
    }
}
class HuaweiMaker extends PhoneMaker
{
    @Override
    public void getPhone()
    {
        System.out.println("生产出了华为手机");
    }
}

//1-3 工厂
class PhoneFactory
{
    public  PhoneMaker makePhone(int phoneType)
    {
        PhoneMaker pm = null;
        switch (phoneType)
        {
            case 1:
                pm=new IphoneMaker();
                break;
            case 2:
                pm=new HuaweiMaker();
                break;
            default :
                    break;

        }
        return pm;
    }
}

客户端:

        //1、简单工厂模式
        PhoneFactory pf=new PhoneFactory();
        PhoneMaker pm = pf.makePhone(1);
        pm.getPhone();

优缺点:

优点
(1)简单工厂包含必要的判断逻辑,简单工厂实现了对象的创建和使用的分离。
(2)客户端无需知道所创建的具体产品类的类名,只需要具体产品类对应的参数即可!
(3)在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性

缺点
(1)工厂类的职责过重,包含逻辑判断语句,它一旦有问题,整个系统都要出问题(2)在添加新的类的时候,简单工厂类就要修改,违反了开放——封闭原则!

2-工厂方法模式

同样,直接上代码:
//----------------2、工厂方法模式---------------------
//生产者接口
interface ITVMaker
{
    void getTV();
}
//工厂接口
interface ITVFactory
{
    ITVMaker getTVMaker();
}

//----------------
//具体生产者
class AppleTVMaker implements ITVMaker
{
    @Override
    public void getTV()
    {
        System.out.println("生产出了苹果电视");
    }
}
class  HuaweiTVMaker implements ITVMaker
{
    @Override
    public void getTV()
    {
        System.out.println("生产出了华为电视");
    }
}
//具体工厂
class AppleTVFactory implements  ITVFactory
{
    @Override
    public ITVMaker getTVMaker()
    {
        return new AppleTVMaker();
    }
}
class HuaweiTVFactory implements ITVFactory
{
    @Override
    public ITVMaker getTVMaker()
    {
        return new HuaweiTVMaker();
    }
}

客户端:

        //2、工厂方法模式
        //如果要苹果电视
        ITVFactory  tvf = new AppleTVFactory();
        ITVMaker tvm = tvf.getTVMaker();
        tvm.getTV();
        //如果要华为电视
        // ITVFactory  tvf = new HuaweiTVFactory();

优缺点:

优点:
(1)工厂方法用来创建客户所需要的产品,同时隐藏了哪种具体产品类将被实例化的细节,用户只需要要关注工厂,不需要关注创建的细节!
(2)在增加修改新的产品的时候不用修改代码,只需要增加对应的工厂就好,完全符合开放——封闭性原则!
(3)创建对象的细节完全封装在具体的工厂内部,而且有了抽象的工厂类,所有的具体工厂都继承了自己的父类!完美的体现了多态性!

缺点:
(1)在增加新的产品时,也必须增加新的工厂类,会带来额外的开销

3-抽象工厂模式

同样,直接上代码:
//--------------------3、抽象工厂模式--------------
//产品接口
class BookMaker //产品1
{
    public void makeBook()
    {}
}
class  PenMaker //产品2
{
    public void makePen()
    {}
}
//工厂接口
interface IstudentFactory
{
    BookMaker CreateBookmaker();
    PenMaker CreatPenkmaker();
}
//------实现具体产品
class MinBookMaker extends BookMaker
{
    @Override
    public void makeBook()
    {
        System.out.println("生产了小学课本");
    }
}
class  MinPenMaker extends PenMaker
{
    @Override
    public void makePen()
    {
        System.out.println("生产了小学生用的笔");
    }
}
//  。。。。。产品1234...
//具体工厂
class  MinStudentFactory implements IstudentFactory
{
    @Override
    public BookMaker CreateBookmaker()
    {
        return  new MinBookMaker();
    }

    @Override
    public PenMaker CreatPenkmaker()
    {
        return  new MinPenMaker();
    }
}
//......工厂1234.....

客户端:

//3、抽象工厂
        IstudentFactory factory = new MinStudentFactory(); //生产小学生的产品系列
        BookMaker bookMaker = factory.CreateBookmaker();
        PenMaker penMaker =factory.CreatPenkmaker();
        bookMaker.makeBook();
        penMaker.makePen();
     //...生产中学生的系列产品.....
     //
IstudentFactory factory = new MiddleStudentFactory();
//----- 3.1 以下是配合反射的抽象工厂------
        String studentType="Min";
        try
        {
           // Class<?> c =Class.forName(this.getClass().getPackage().getName() + studentType + "StudentFactory");
            Class<?> c =Class.forName("com.anson.designpattern.designPattern.MinStudentFactory");
            IstudentFactory studentFactory = (IstudentFactory)c.newInstance();
            BookMaker bookMaker1 = studentFactory.CreateBookmaker();
            PenMaker penMaker1 =studentFactory.CreatPenkmaker();
            bookMaker1.makeBook();
            penMaker1.makePen();
        }
        catch (Exception e)
        {
            System.out.println(e);
        }

优缺点:

增加一个产品族很简单,而增加一个新的产品就会非常复杂!

4-一句话总结

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 : 用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 : 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
07-31 19:33