1、概述:工厂模式中一般会分为三种方式。根据创建的类别,我这样分类。(1)创建一类对象的简单工厂和工厂方法;(2)创造多个类别的抽象工厂。
2、作用:增加代码重用性和扩展性,比如说针对不同数据库的实现的时候就可以使用简单工厂模式来达到数据库的分离(解耦),这样在装换数据库时,面对的修改代价将降低
3、对比:三种的方式的抽象级别从简单工厂->工厂方法->抽象工厂依次递增,抽象级别越高,可扩展性越好。当然不是说越抽象越好,因为越抽象就越难理解,代码相对就会变得复杂,所以必须根据实际情况来确定使用的具体模式
4、实现:根据场景我们首先来实现简单工厂模式
场景:现我准备开一个公司(工厂)来开发软件,我准备招一批懂java和csharp语言的人来工作,因为我目前的业务就只需要这两种程序员。于是我的公司开始运营了
public interface Programmer {
void develop();
}
public class JavaProgrammer implements Programmer{
public void develop() {
System.out.println("I am develop java softeware");
}
}
public class CsharpProgrammer implements Programmer {
public void develop() {
System.out.println("I am develop csharp softeware");
}
}
工厂类如下
public class SimpleFactory {
public static Programmer createProgrammer(String type)
{
if(type.equals("java"))
return new JavaProgrammer();
if(type.equals("csharp"))
return new CsharpProgrammer();
return null;
}
}
现在有一个java程序的软件需要开发,测试如下
public static void main(String[] args) {
System.out.println("I want a java programmer");
Programmer p=SimpleFactory.createProgrammer("java");
p.develop();
}
如我的预期所致,这个java程序正在有java程序员火热的进行中,相信不久后就会做完,信心满满的。
过了几天又有一个C#的程序,于是我
public static void main(String[] args) {
System.out.println("I want a csharp programmer");
Programmer p=SimpleFactory.createProgrammer("csharp");
p.develop();
}
嘿嘿,完全没有问题。接下来一个月里陆续接到了关于java和C#的订单,各个程序都忙得焦头烂额的,我自己也疲惫不堪。
突然有一天,有个客户找我谈个业务需要用php来做,可以我公司的所有员工以前都是做java和C#的啊,管他呢,接下来再说,反正工期比较长。
回到公司我问我的员工,现在接了个php的程序问问他们谁做。他们个个都说现在手头的项目都还有几个,对php又不熟,学习也要花时间啊(反应到程序中就是,简单工厂模式面对变化时需要修改原有的代码,这样对于大项目来说是灾难性的)。想想也是,这下可就难倒我了。后悔当初没有找个搞php的,但是想想也不对啊,开发语言那么多,我总不能把所有开发语言的人都一次性招进来吧(程序无法预知所有的情况,简单工厂就是存在找个弊端,开放性原则不好)。
于是我重新规划一下,期待下期的工厂方法来解决找个问题