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

设计模式-工厂模式

程序员文章站 2022-05-17 15:12:24
...

工厂模式,顾名思义就是一个工厂要能根据不同原料来生产不同的产品,我们把工厂中的生产线叫产品生产者,很明显工厂有很多的生产线,工厂会根据提供的原料,选择那条产线来生产出对应的产品。

 

1.首先所有的生产线都有一个公用方法那就是生产动作,我们写接口

/**
* Created with IntelliJ IDEA.
* User: hank
* Date: 2016/5/26
* Time: 11:22
* 生产类接口 ”生产出各种类型的产品“
* To change this template use File | Settings | File Templates.
*/
public interface Productor {
/**
* 生产方法
*/
public void product();
}

 2.实现生产接口,因为我们要生产不同的产品

/**
 * Created with IntelliJ IDEA.
 * User: hank
 * Date: 2016/5/26
 * Time: 11:25
 * 生产TV 的生产者
 * To change this template use File | Settings | File Templates.
 */
public class TVProductor implements Productor {
    @Override
    public void product() {
        System.out.println("TVProductor.product===>生产TV");
    }
}
/**
 * Created with IntelliJ IDEA.
 * User: hank
 * Date: 2016/5/26
 * Time: 11:25
 * 生产PC的生产者
 * To change this template use File | Settings | File Templates.
 */
public class PCProductor implements Productor {
    @Override
    public void product() {
        System.out.println("PCProduct.product===>生产PC");
    }
}

 3.写工厂类:

/**
 * Created with IntelliJ IDEA.
 * User: ${xiangdong.he}
 * Date: 2016/5/26
 * Time: 11:27
 * 工厂会根据提供的原料“strType”,自助选择那条产线来生产,来生产出对应的产品
 */
public class ProductorFactory {
    public Productor getProductor(String strType){
        if("TV".equals(strType)){
            return new TVProductor();
        }else if("PC".equals(strType)){
            return new PCProductor();
        }else{
            System.out.println("对不起!我们工厂不能生产这种产品!~");
            return null;
        }
    }
}

 这样我们就会有“工厂了”,根据我们自己的实力,依来源材料来做各种不同的产品。

再比如我们的客户不知道我们自己能生产什么,突然送过来原材料让我们生产我们无法生产的产品那就只能说System.out.println("对不起!我们工厂不能生产这种产品!~");

那我们优化下给我们的工厂打广告告知大众能生产什么.

改写工厂类的方法:

    public PCProductor getPcProductor(){
        return new PCProductor();
    }
    
    public TVProductor getTvProductor(){
        return new TVProductor();
    }

 这样我们就告诉客户我们只生产这两种类型的产品。

test:

public class MyTest {
    public static void main(String[] args) {
        //1.
        //实例化工厂
        ProductorFactory pf = new ProductorFactory();
        //获得工厂具体的生产者
        Productor p =  pf.getProductor("TV");
        //生产者生产
        p.product();

        //2.
        //获得工厂具体的生产者
        PCProductor pcpd = pf.getPcProductor();
        pcpd.product();
    }

}

显然第二种我们不会犯加工不得错误

这样如果我们有钱了在添加一条生产DV的生产线,只要在在写一个实现方法,再在工厂类中加入。

这样我们要改动工厂类。

还有一种抽象工厂模式模式,让我们不用修改的太多。

就是将工厂抽象出一个接口,由具体的工厂类实现,生产者还是之前的实现原理,相当于我们将之前的生产线升级成一个工厂一条产线。这样我们在增加生产其他产品的时候就会在建立一个工厂,对应的在建立一条产线,不会再修改任何东西。