设计模式——工厂模式

1.什么是工厂类
工厂类,简单说就是类的实例不通过自身new的方式构造,而是通过一个xxFactory.java的类来创建,这个类就是工厂类
 
2.工厂模式的uml图解:
2.1 简单工厂类uml类图
 

 

2.2  抽象工厂类uml类图:

举例1:简单工厂模式

 创建一个Facotry类,提供SendFactory.java,提供produceEmailSender()和produceSmsSender()分别用于创建EmailSender实例对象和SmsSender实例对象。

package com.asiainfo.test.factory2;
/**
 * 生产的工厂类
 * @author luke
 *
 */
public class SendFactory {
    //生产emailSender
    public static Sender produceEmailSender(){
        return new EmailSender();
    }
    
    //生成smsSender
    public static Sender produceSmsSender(){
        return new SmsSender();
    }
}
View Code

定义一个Sender.java接口

package com.asiainfo.test.factory2;
/**
 * 
 * @author hasee
 *
 */
public interface Sender {
    public void send();
}

分别定义EmailSender.java和SmsSender.java用于实现Sender.java接口

EmailSender.java:

package com.asiainfo.test.factory2;
/**
 * 实现sender接口
 * @author hasee
 *
 */
public class EmailSender implements Sender {

    @Override
    public void send() {
        System.out.println("使用email发送");
    }

}

 

 SmsSender.java:

package com.asiainfo.test.factory2;
/**
 * 实现sender接口
 * @author hasee
 *
 */
public class SmsSender implements Sender {

    @Override
    public void send() {
        System.out.println("使用sms发送");
    }

}

测试类FactoryTest.java

package com.asiainfo.test.factory2;
/**
 * 测试类
 * @author luke
 *
 */
public class FactoryTest {
    public static void main(String[] args) {
        Sender sender = SendFactory.produceEmailSender();
        sender.send();
        sender = SendFactory.produceSmsSender();
        sender.send();
    }
}

 

测试结果,控制台打印:

使用email发送
使用sms发送

 

举例2:抽象工厂模式

1.抽象工厂类AbstractFactory.java

package com.asiainfo.test.factory6;

import com.asiainfo.test.factory6.Product;

/**
 * 抽象工厂类
 * @author luke
 *
 */
public interface AbstractFactory {
    //生产圣诞系列
    public Product createChristProduct();
    //生成新系列
    public Product createNewYearProduct();
}
View Code

2.HatFactory.java,ShoesFactory.java分别是生成帽子和鞋子的工厂类,都实现抽象工厂类。

package com.asiainfo.test.factory6;

public class HatFactory implements AbstractFactory  {
    private String color;
    @Override
    public Product createChristProduct() {
        Hat hat = new Hat();
        hat.setColor(color);
        hat.setFestivalClass("圣诞系列");
        return hat;
    }

    @Override
    public Product createNewYearProduct() {
        Hat hat = new Hat();
        hat.setColor(color);
        hat.setFestivalClass("新年系列");
        return hat;
    }

    public void setColor(String color) {
        this.color = color;
    }
    
}
View Code

 

package com.asiainfo.test.factory6;

public class ShoesFactory implements AbstractFactory {
    private String color;
    //生产圣诞系列鞋子
    @Override
    public Product createChristProduct() {
        Shoes shoes = new Shoes();
        shoes.setColor(color);
        shoes.setFestivalClass("圣诞系列");
        return shoes;
    }
    
    //生成新年系列鞋子
    @Override
    public Product createNewYearProduct() {
        Shoes shoes = new Shoes();
        shoes.setColor(color);
        shoes.setFestivalClass("新年系列");
        return shoes;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
    
    

}
View Code

3. 定义产品接口Product.java,并定义Hat.java,Shoes.java分别实现Product.java接口

package com.asiainfo.test.factory6;

/**
 * 产品接口
* Description: 
* @author lindq3
* @date 下午03:35:42
 */
public interface Product {
    public void operate();
}


package com.asiainfo.test.factory6;

public class Hat implements Product {
    private String color;//颜色
    private String festivalClass;//节日系列
    @Override
    public void operate() {
        System.out.println("戴的帽子是"+this.festivalClass+",颜色是" + this.color);
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public void setFestivalClass(String festivalClass) {
        this.festivalClass = festivalClass;
    }
    public String getFestivalClass() {
        return festivalClass;
    }
    
    

}




package com.asiainfo.test.factory6;

public class Shoes implements Product {
    private String color;//颜色
    private String festivalClass;//节日系列
    @Override
    public void operate() {
        System.out.println("穿鞋子是"+this.festivalClass+",颜色是" + this.color);

    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getFestivalClass() {
        return festivalClass;
    }
    public void setFestivalClass(String festivalClass) {
        this.festivalClass = festivalClass;
    }
    
}
View Code

4.测试类:

package com.asiainfo.test.factory6;
/**
 * 测试类
 * @author luke
 *
 */
public class FactoryTest {
    public static void main(String[] args) {
        ShoesFactory shoesFactory = new ShoesFactory();
        //设置颜色,并生产对应节日系列的产品
        hatFactory.setColor("白色");
        Product chrisMaxHat = hatFactory.createChristProduct();
        
        shoesFactory.setColor("红色");
        Product newYearShoes = shoesFactory.createNewYearProduct();
        
            
        //操作
        chrisMaxHat.operate();
        newYearShoes.operate();
    }
}
View Code

5.测试结果:

戴的帽子是圣诞系列,颜色是白色
穿鞋子是新年系列,颜色是红色

 

 总结:

工厂模式,把类实例的创建权交给工厂类。

有很好的拓展性,如果要生产新的系列的产品,例如衣服,只需要重新定一个ClothFactory和Cloth类,ClothFactory类实现AbstractFactory接口,Cloth类实现Product产品接口,即可,不需要再修改AbstractFactory,拓展性大大提高。

有一个问题:如果我在上面代码的基础上,需要再增加一个中秋节日系列,感觉还是需要对代码进行改动。

posted on 2017-02-04 17:29  lukelin1989  阅读(183)  评论(0编辑  收藏  举报

导航