JAVA设计模式学习--工厂模式

  今天谈一下对工厂模式学习的总结。

  看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点。

  自己理解工厂模式是通过这两种模式的特点来理解和定义的,首先工厂模式有简单工厂模式(不在23中设计模式中),工厂方法模式,抽象工厂模式,把三种模式对比来定义,根据不同模式的特点来记忆。

  工厂模式是让对象的创建和使用分离,每次使用时不用自己创建,把创建对象的过程交给工厂来完成。

定义(仅供参考 -- 理解后再形成自己的定义)

  工厂方法模式定义:定义创建一个产品的工厂接口,将这一个产品的具体创建方法延迟到子类工厂实现,当需要使用这个产品时通过工厂获取。

             如果只有一类产品定义为简单工厂模式了.

  抽象工厂模式定义:定义创建一系列产品的工厂接口,将这一系列产品的具体创建过程延迟到子类工厂,使用时通过工厂就可以创建一系列的产品。

优缺点对比  

  工厂方法模式:

    优点-可以进行不同产品的扩展,如定义一个水果类工厂就可以创建不同的水果,现在要扩展一个蔬菜类产品就再定义一个蔬菜类工厂。

    缺点-单要创建一系列产品类的时候,会出现工厂泛滥,一个产品类就要创建一个产品接口,一个产品工厂,增加系统复杂性。比如我还要创建动物类,工具类等,

      工厂将越来越多。

  抽象工厂模式:

    优点-可以创建一系列的产品,当增加新的产品系列可以不用修改代码,如建了一个海尔系列的电器,再建一个格力系列的就可以只增加一个名称。

    缺点-当增加一个产品时要改动工厂所有的接口。如工厂创建的是洗衣机,电视,空调,现在要增加一个热水器的产品,那么所有工厂子类都要增加。

模式结构对比

  工厂模式的结构:

    1.抽象产品:Product

    2.抽象工厂:AbstractFactory

    3.具体产品:Concrete Product

    4.具体工厂:Conrete Factory

  抽象工厂模式结构:

    1.抽象产品系列:Product

    2.抽象工厂:AbstractFactory

    3.具体产品系列:Concrete Product

    4.具体工厂:Conrete Factory

上代码

 工厂模式:

//产品
public interface Product {
    public  void run();
}
//工厂
public interface Factory {
    public Product createFactory();
}

//车类产品和工厂
public class Car implements Product {
    @Override
    public void run() {
        System.out.println("驾车起飞。。。。。。");
    }
}
public class CarFactory implements Factory {
    @Override
    public Product createFactory() {
        return new Car();
    }
}

//食物类产品和工厂
public class Food implements Product{
    @Override
    public void run() {
        System.out.println("eat.......");
    }
}
public class FoodFactory implements Factory {
    @Override
    public Product createFactory() {
        return new Food();
    }
}


//测试代码
public class TestFactory {

    public static void main(String[] args) {
        Factory f = new CarFactory();
        //Factory f = new FoodFactory();
        Product p = f.createFactory();
        p.run();
    }
}

抽象工厂模式:

//产品系列
public interface TV {
    public void show();
}
public interface Washing {
    public void wash();
}
public interface Air {
    public void fever();
}
//产品工厂
public interface AbstractFactory {
    
    public TV crateTV();
    public Air createAir();
    public Washing createWashing();
}

//HR系列产品
public class HRTelevision implements TV{
    @Override
    public void show() {
        System.out.println("海尔电视。。。。。");
    }
}
public class HRWarshing implements Washing{
    @Override
    public void wash() {
        System.out.println("海尔洗衣机。。。");
    }
}
public class HRAir implements Air{

    @Override
    public void fever() {
        System.out.println("海尔空调。。。");
    }
}
//HR系列产品工厂
public class HRFactory implements AbstractFactory {

    @Override
    public TV crateTV() {
        return new HRTelevision();
    }
    @Override
    public Air createAir() {
        return new  HRAir();
    }
    @Override
    public Washing createWashing() {
        return new HRWarshing();
    }

}

//GL系列产品
public class GLTelevision implements TV{
    @Override
    public void show() {
        System.out.println("格力电视。。。。");
    }
}
public class GLAir implements Air {

    @Override
    public void fever() {
        System.out.println("格力空调。。。。。");
    }
}
public class GLWashing implements Washing {

    @Override
    public void wash() {
        System.out.println("格力洗衣机。。。");
    }
}

//GL系列产品工厂
public class GLFactory implements AbstractFactory {

    @Override
    public TV crateTV() {
        return new GLTelevision();
    }

    @Override
    public Air createAir() {
        return new GLAir() ;
    }

    @Override
    public Washing createWashing() {
        return new GLWashing();
    }

}

//测试代码
public class Test {

    public static void main(String[] args) {
        
        //AbstractFactory  f = new GLFactory();
        AbstractFactory  f = new HRFactory();
        TV tv =  f.crateTV();
        Air air =  f.createAir();
        Washing warsh = f.createWashing();
        tv.show();
        air.fever();
        warsh.wash();
        
    }
}

测试代码中只需要修改工厂类就可以实现生产不同的产品和不同的产品系列了, 当工厂可以通过配置文件来取的时候就不用更改任何代码就实现了,实际生产中工厂都可以通过快速编码来配置,很多成型的产品都是直接配置就能完成整个系统的初始化了。

这是自己理解并输入的第二篇关于设计模式的笔记了,只是看一遍和根据自己的思路写一遍真的是完全不同的感觉,如果只是看一遍过一天可能就忘记了, 如果自己思路清晰之后再自己设计下,根据思路写一遍如果有问题又回去看看具体细节,一路记下来差不多就能搞定了,希望对路过的你有帮助。

后续继续学习中。。。

原文地址:https://www.cnblogs.com/crazycomputers/p/11775445.html