版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34359363/article/details/82624356
工厂模式是什么?
定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类之中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式的元素
- 抽象工厂角色:是工厂方法的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
- 具体工厂角色:是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且收到应用程序调用而创建产品对象。
- 抽象产品角色:工厂方法模式所创建的对象的父类。
- 具体产品角色:实现抽象产品角色所定义的接口。具体产品与具体工厂,一一对应。
谈到工厂模式我们就不得不谈简单工厂模式和工厂模式的区别
从图上我们也可以看出,简单工厂就是有一个专门生产某个产品的类。产生那种运动员是通过参数决定的
而工厂模式有个抽象工厂,生成什么类型运动员是通过他的具体工厂而生产出来的不在依靠参数生产。
简单例子
简单工厂
package myDesignPatternsTest.factoryPattern;
public interface Athletes {
public void run();
public void eat();
public void sleep();
}
package myDesignPatternsTest.factoryPattern;
public class RunAthletes implements Athletes {
@Override
public void run() {
System.out.println("长跑运动员在跑");
}
@Override
public void eat() {
System.out.println("长跑运动员在吃");
}
@Override
public void sleep() {
System.out.println("长跑运动员在谁");
}
}
package myDesignPatternsTest.factoryPattern;
public class Swing implements Athletes {
@Override
public void run() {
System.out.println("游泳运动员在游泳");
}
@Override
public void eat() {
System.out.println("游泳运动员在吃");
}
@Override
public void sleep() {
System.out.println("游泳运动员在睡");
}
}
package myDesignPatternsTest.factoryPattern;
public class SimpleFactory {
public Athletes CreateAthletes(String type){
if ("Run".equals(type)){
return new RunAthletes();
}
if ("Swing".equals(type)){
return new Swing();
}
return null;
}
}
package myDesignPatternsTest.factoryPattern;
public class Client {
public static void main(String[] args) {
SimpleFactory simpleFactory=new SimpleFactory();
Athletes runAthletes=simpleFactory.CreateAthletes("Run");
runAthletes.eat();
runAthletes.run();
runAthletes.sleep();
Athletes swing=simpleFactory.CreateAthletes("Swing");
swing.sleep();
swing.run();
swing.eat();
}
}
长跑运动员在吃
长跑运动员在跑
长跑运动员在谁
游泳运动员在睡
游泳运动员在游泳
游泳运动员在吃
工厂模式
运动员的部分不用变。
package myDesignPatternsTest.factoryPattern;
//改接口
public interface SimpleFactory {
public Athletes CreateAthletes();
}
package myDesignPatternsTest.factoryPattern;
//生成长跑的工厂
public class RunFactory implements SimpleFactory {
@Override
public Athletes CreateAthletes() {
return new RunAthletes();
}
}
package myDesignPatternsTest.factoryPattern;
//生成游泳的工厂
public class SwingFactory implements SimpleFactory {
@Override
public Athletes CreateAthletes() {
return new Swing();
}
}
package myDesignPatternsTest.factoryPattern;
public class Client {
public static void main(String[] args) {
/* SimpleFactory simpleFactory=new SimpleFactory();
Athletes runAthletes=simpleFactory.CreateAthletes("Run");
runAthletes.eat();
runAthletes.run();
runAthletes.sleep();
Athletes swing=simpleFactory.CreateAthletes("Swing");
swing.sleep();
swing.run();
swing.eat();*/
SimpleFactory runFactory=new RunFactory();
SimpleFactory simpleFactory = new SwingFactory();
Athletes runAthletes=runFactory.CreateAthletes();
runAthletes.eat();
runAthletes.run();
runAthletes.sleep();
Athletes swing=simpleFactory.CreateAthletes();
swing.sleep();
swing.run();
swing.eat();
}
}
总结
简单工厂方法:专门定义一个类来负责其它类实例的创建,被创建的实例通常具有相同的父类
工厂模式:定义一个用于创建对象的接口,让子类决定具体实例化哪一个类。使类的实例化延迟到子类。