一、工厂模式简介
工厂模式分为简单工厂模式,工厂方法模式和抽象工厂模式,它们都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,目的是降低系统中代码耦合度,并且增强了系统的扩展性。
二、简单工厂模式
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。
简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码逻辑将会非常复杂。
interface People
{
public function say();
}
class Man implements People
{
public function say()
{
System.out.println("this is a man");
}
}
class Women implements People
{
public function say()
{
System.out.println("this is a woman");
}
}
//简单工厂模式,根据传入的不同参数,创建不同的对象
class SimpleFactory
{
public static People create(String name)
{
if (name == "man") {
return new Man();
} elseif (name == "women") {
return new Women();
}
}
}
//测试
public static void main(String [] args){
//通过工厂类创建man对象
Man man=Simplefactory.create("man");
//通过工厂类创建women对象
Women women=Simplefactory.create("women");
}
优缺点分析:
简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。
三、工厂方法模式
此模式中,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成。这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建。当系统需要新增一个产品是,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则。
interface People
{
public function say();
}
class Man implements People
{
public function say()
{
System.out.println(this is a man);
}
}
class Women implements People
{
public function say()
{
System.out.println(this is a man);
}
}
//与简单工厂模式相比。区别在于,此处将对象的创建抽象成一个接口
interface CreatePeople
{
public function create();
}
//生产男人的工厂
class FactoryMan implements CreatePeople
{
public function create()
{
return new Man();
}
}
//生产女人的工厂
class FactoryWomen implements CreatePeople
{
public function create()
{
return new Women();
}
}
public static void main(String [] args){
FactroyMan factoryman=new FactoryMan();
FactroyWommen factorywomen=new FactoryWomen();
//通过生产男人的工厂生产男人
Man man=factoryman.create();
//通过生产女人的工厂生产女人
Women women=factroywomen.create();
}
优缺点分析:
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
四、抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。
interface TV{
public function open();
public function watch();
}
class HaierTv implements TV
{
public function open()
{
System.out.println("打开海尔电视");
}
public function watch()
{
System.out.println("观看海尔电视");
}
}
class ChangHongTv implements TV
{
public function open()
{
System.out.println("打开长虹电视");
}
public function watch()
{
System.out.println("观看长虹电视");
}
}
interface PC{
public function work();
public function play();
}
class HaierPc implements PC
{
public function work()
{
System.out.println("打开海尔电脑");
}
public function play()
{
System.out.println("玩海尔电脑");
}
}
class ChangHongPc implements PC
{
public function work()
{
System.out.println("打开长虹电脑");
}
public function play()
{
System.out.println("玩长虹电脑");
}
}
abstract class Factory{
abstract public static function createPc();
abstract public static function createTv();
}
class HaierFactory extends Factory
{
public static function createTV()
{
return new HaierTv();
}
public static function createPc()
{
return new HaierPc();
}
}
class ChangHongFactory extends Factory
{
public static function createTV()
{
return new ChangHongTv();
}
public static function createPc()
{
return new ChangHongPc();
}
}
//测试
public static void main(String [] args){
HaierFactory haierfactory=new HaierFactory();
ChangHongFactory changhongfactory = new ChangHongFactory();
haierfactory.createTV();
haierfactory.createPc();
changhongfactory.createTV();
changhongfactory.createPc();
}
优缺点分析:
在上面的Factory抽象类中,定义了两个抽象方法,这两个抽象方法分别用来生产不同的产品(即由不同类实例化的对象)。