设计模式系列-工厂模式

介绍: 在运行期动态的决定将哪个类实例化,提高灵活性

分类:

1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)

代码实现

1. 简单工厂模式(Simple Factory )
简单工厂模式(Simple Factory Pattern ):又称静态工厂方法模式(Static Factory Method Pattern),它属于创建型模式,在简单工厂模式中,可以根据入参的不同返回不同的实例. 简单工厂模式专门用来定义一个类负责创建其它类的实例,被创建类通常具共同的父类(extends or implements).

代码实现如下:
1.通过if.switch实现

public interface Iproduct {}

public class Computer implements Iproduct {
    public Computer() {
        System.out.println("Computer");
    }
}

public class TV implements Iproduct {

    public TV() {
        System.out.println("TV");
    }
}

public class Factory {

    public static Iproduct createProduct(String productName) {
        Iproduct product;
        switch (productName) {
            case "TV":
                product = new TV();
                break;
            case "Computer":
                product = new Computer();
                break;
            default:
                product = null;
                break;
        }
        return product;

    }

}

测试如下:

public class Customer {

    public static void main(String[] a) {
        Iproduct product = Factory.createProduct("TV");
        System.out.println(product);
    }
}

输出如下: TV

缺点:扩展性差,每加入一种product,必须修改Factory类

2.通过反射来实现

public class Factory2 {

    public static Iproduct createProduct(String className) throws Exception {
        try {
            return (Iproduct)Class.forName(className).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        throw new Exception("not product found");
    }

} 

缺点:扩展性差,客户端必须记住全部完整类路径

3.引入.properties文件 来进行className 与alias 进行映射

public class Factory3 {

    private static Map<String, String> map = new HashMap<String, String>();

    static {
        InputStream res = Factory3.class.getClassLoader().getResourceAsStream("product.properties");
        Properties properties = new Properties();
        try {
            properties.load(res);
            properties.keySet().forEach(property -> map.put((String) property, (String) properties.get(property)));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static Iproduct createProduct(String productName) {
        try {
            return (Iproduct) Class.forName(map.get(productName)).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

}

测试输出如下 TV

2.工厂方法模式(FACTORY METHOD )

定义一堆产品.每个产品 由一个专门的工厂来制造,扩展时,无需修改原来的逻辑,只需要实现Factory 接口即可
代码如下:

/**
* 两个接口
*/ 
public interface Factory {

    Product create();
}

public interface Product {
}

public class TV  implements Product{
    public TV(){
        System.out.println("TV");
    }

}

public class TVFactory implements Factory{

    @Override
    public Product create() {
        return new TV();
    }
}
//测试
public class Test {
    public static void main(String a){
        Factory factory= new TVFactory();
        factory.create();
    }

}

输出: TV

3.抽象工厂模式(Abstract Factory )

//TODO 目前没有用到.待补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值