简介
工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。
用简单的话来说,工厂模式是工厂模式简单的一种,他可以用一些简单的方法去隐藏对象的细节,一般只需告诉工厂类所需的类型就可以,工厂类会返回你需要的产品类,但你在客户端看到的只是产品的抽象对象,不需要关心返回是什么类。客户端唯一知道的就是具体子类,也就是工厂子类。除了这一点,基本是达到依赖倒转原则的要求罢了!
1.简单工厂模式
该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象
实例演示:
女娲造人
接口
public interface Human {
public void talk( ); }
实例类
public class YellowHuman implements Human {
public void talk( ) {
System.out.println("您好!");
}
}
public class WhiteHuman implements Human {
public void talk( ) {
System.out.println("Hello!");
}
}
工厂类
public class HumanFactory {
public static Human createHuman(String s){
Human human=null;
if(s.equals(new String("whiteHuman")))
human=new WhiteHuman( );
if(s.equals(new String("yellowHuman")))
human=new YellowHuman( );
return human;
}
}
Application类
public class NvWa {
public static void main(String[] args) {
Human human = HumanFactory.createHuman("yellowHuman");
human.talk( );
}
}
2.工厂模式
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂
定义一个用来创建对象的接口,让子类决定实例化哪一个类,让子类决定实例化延迟到子类。
也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。
实例演示
接口类
public interface Human {
public void talk();
}
public interface HumanFactory {
public Human createHuman();
}
产品类
public class WhiteHuman implements Human{
public void talk(){
System.out.println("Hello");
}
}
public class YellowHuman implements Human{
public void talk(){
System.out.println("您好");
}
}
public class BlackHuman implements Human{
public void talk( ) {
System.out.println("Hello!");
}
}
工厂类
public class WhiteHumanF implements HumanFactory{
public Human createHuman(){
return new WhiteHuman();
}
}
public class YellowHumanF implements HumanFactory{
public Human createHuman(){
return new YellowHuman();
}
}
public class BlackHumanF implements HumanFactory{
public Human createHuman(){
return new BlackHuman();
}
}
Application类
public class NvWa {
public static void main(String[]args){
HumanFactory humanFactory=null;
humanFactory = new WhiteHumanF();
Human human = humanFactory.createHuman();
human.talk();
}
}
参考资料:
https://blog.csdn.net/weixin_44277627/article/details/88067366
https://www.cnblogs.com/yssjun/p/11102162.html