上期回顾:公司在扩大的同时,招的员工不再是只有程序员了。需要招销售员,这样就给原有的结构有了较大的冲击。以前的那个模式已经不再适用,接下来我们将使用抽象工厂模式来解决这个问题。
实现:我们将进一步抽象。不管是程序员还是销售员,都是员工,对于公司招人来说,员工已经可以达到最高抽象级别了
员工接口
public interface Employee {
void work();
}public interface Programmer extends Employee { }
java程序员
public class JavaProgrammer implements Programmer{
public void work() {
System.out.println("I am develop java softeware");
}
}public class CsharpProgrammer implements Programmer {
public void work() {
System.out.println("I am develop csharp softeware");
}
}public class PhpProgrammer implements Programmer {
public void work() {
System.out.println("I am develop php softeware");
}
}public class RubyProgrammer implements Programmer {
public void work() {
System.out.println("I am develop ruby softeware");
}
}public interface Seller extends Employee {
}public class JavaSeller implements Seller {
public void work() {
System.out.println("I am selling java software");
}
}public class CsharpSeller implements Seller {
public void work() {
System.out.println("I am selling csharp software");
}
}public interface AbstractFactory { Employee getEmployee(); }
public class JavaFactory implements AbstractFactory {
public Employee getEmployee() {
return new JavaProgrammer();
}
}csharp开发部门
public class CsharpFactory implements AbstractFactory {
public Employee getEmployee() {
return new CsharpProgrammer();
}
}public class PhpFactory implements AbstractFactory {
public Employee getEmployee() {
return new PhpProgrammer();
}
}public class RubyFactory implements AbstractFactory {
public Employee getEmployee() {
return newRubyProgrammer();
}
}public class JavaSellerFactory implements AbstractFactory {
public Employee getEmployee() {
return new JavaSeller();
}
}public class CsharpSellerFactory implements AbstractFactory {
public Employee getEmployee() {
return new CsharpSeller();
}
}public static void main(String[] args) { System.out.println("I want a java seller"); AbstractFactory factory=new JavaSellerFactory(); Employee seller=factory.getEmployee(); seller.work(); }
接下来我需要找一个清洁工
public class Cleaner implements Employee {
public void work() {
System.out.println("I am cleaning......");
}
}public class CleanFactory implements AbstractFactory {
public Employee getEmployee() {
return new Cleaner();
}
}public static void main(String[] args) {
System.out.println("I want a cleaner");
AbstractFactory factory=new CleanFactory();
Employee seller=factory.getEmployee();
seller.work();
}
总结:工厂模式分为三种:简单工厂、工厂方法和抽象工厂。在使用时首先要确定工厂生产的类别是否唯一,如果是可以考虑前两种,如果不是需要使用第三种。工厂方法比简单工厂更开放,更符合OO的开闭原则,但具体使用时,如果生产的对象可以确定,那么可以考虑使用简单工厂。
(*文中的例子只是为了说明问题,如有不恰当之处还望见谅)