您的位置:首页 > 其它

设计模式之工厂模式

2017-05-15 11:29 127 查看
目的:对于实现同一接口的类,创建一个工厂类来实例化这些对象.

本文提到的四种工厂模式是不断优化改进的结果

1.简单工厂模式

interface Animal{
void eat();
}

class Dog implements Animal{
@Override
public void eat(){
System.out.println("Dog eat bone!");
}
}
class Cat implements Animal{
@Override
public void eat(){
System.out.println("Cat eat fish!");
}
}
class Factory{
public Animal getAnimal(String s){
if(s=="Dog"){
return new Dog();
}
else if(s=="Cat"){
return new Cat();
}
else{
System.out.println("Please input correct animal name!");
return null;
}
}
}
public class FactoryPattern {
public static void main(String[] args){
Factory factory=new Factory();
Animal dog=factory.getAnimal("Dog");
dog.eat();
}
}

问题:简单工厂模式在创建对象时需要输入对象的名字,如果错误则无法创建对象,需要改进;

2. 工厂方法模式

interface Animal{
void eat();
}

class Dog implements Animal{
@Override
public void eat(){
System.out.println("Dog eat bone!");
}
}
class Cat implements Animal{
@Override
public void eat(){
System.out.println("Cat eat fish!");
}
}
class Factory{
public Animal getDog(){
return new Dog();
}
public Animal getCat(){
return new Cat();
}
}

public class FactoryMethod {

public static void main(String[] args) {
// TODO Auto-generated method stub
Factory factory=new Factory();
Animal dog=factory.getDog();
dog.eat();
}
}

工厂方法模式在工厂类中增加了不同方法来创建相应的对象.

3. 静态工厂模式:将工厂方法模式中的方法改为静态方法即可.实际常使用静态工厂模式.

工厂方法模式和静态工厂模式都存在一个问题,即每次扩展时,均需要修改工厂类,增加方法来创建相应的对象,违反了开闭原则

4. 抽象工厂模式:

抽象工厂模式是增加一个工厂类的接口AnimalFactory,该接口存在一个方法来产生Animal对象;当程序扩展需要增加一个实现了Animal接口的类时(如Cow),同时需要增加一个实现AnimalFactory接口的工厂类,来产生相应的对象,符合”开闭原则”的要求.

interface Animal{
void eat();
}
class Dog implements Animal{
@Override
public void eat(){
System.out.println("Dog eat bone!");
}
}
class Cat implements Animal{
@Override
public void eat(){
System.out.println("Cat eat fish!");
}
}
interface AnimalFactory{
Animal getAnimal();
}
class DogFactory implements AnimalFactory{
public Animal getAnimal(){
return new Dog();
}
}
class CatFactory implements AnimalFactory{
public Animal getAnimal(){
return new Cat();
}
}

public class AbstractFactoryPattern {
public static void main(String[] args) {
// TODO Auto-generated method stub
DogFactory df=new DogFactory();
Animal dog=df.getAnimal();
dog.eat();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: