首页 > 其他 > 详细

简单工厂,工厂方法,抽象工厂,三种工厂模式

时间:2020-01-15 16:53:44      阅读:74      评论:0      收藏:0      [点我收藏+]

简单工厂

简单工厂是真的简单,如果我们有N个类需要被工厂管理,那我们给N个类分配一个唯一标识,调用工厂方法需要传递标识,工厂根据传入的标识创建对象。这种做法的缺点很明显,扩展性太差!严重违反开闭原则。如果要是又新增M个类需要被工厂管理,那么还要去改工厂类代码。

技术分享图片
package simplefactory_k;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 10:45
* @notify 
* @version 1.0
*/
public class Airplane {

}
View Code
技术分享图片
package simplefactory_k;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 10:46
* @notify 
* @version 1.0
*/
public class Rocket {
}
View Code
技术分享图片
package simplefactory_k;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 10:46
* @notify 
* @version 1.0
*/
public class Screw {
}
View Code
技术分享图片
package simplefactory_k;
/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-01-15 10:46
 * @notify
 * @version 1.0
 */

public class SimpleFactoryK {
    public static Object getObject(String obj) {
        if (obj.equals("飞机")) {
            return new Airplane();
        } else if (obj.equals("火箭")) {
            return new Rocket();
        } else if (obj.equals("螺丝")) {
            return new Screw();
        } else {
            return null;
        }
    }
}
View Code
技术分享图片
package simplefactory_k;
/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 10:53
* @notify 
* @version 1.0
*/
public class Main {
    public static void main(String[] args) {
        Object airplane = SimpleFactoryK.getObject("飞机");
        System.out.println(airplane instanceof Airplane);

        Object rocket = SimpleFactoryK.getObject("火箭");
        System.out.println(rocket instanceof Rocket);

        Object screw = SimpleFactoryK.getObject("螺丝");
        System.out.println(screw instanceof Screw);
    }
}
View Code

工厂方法

工厂方法弥补了简单工厂不易于扩展的缺点,给一个产品族定义一个接口,产品族下边定义具体的产品实现。(产品族的纵向的,接口和实现类,或者抽象类和子类)创建产品族工厂接口,不同的产品工厂创建不同的产品。苹果和香蕉都是都是水果族,苹果工厂生产苹果,香蕉工厂生产香蕉,而他们属于水果工厂。当我们需要增加另外一种水果,例如橘子,需要我们创建一个橘子类,和一个橘子类的工厂,这听起来好像又麻烦了许多。但是我们假设,创建一个类需要很多的参数,整体的创建需要写很多的代码。那创建一个工厂类是完全有必要的。

 

技术分享图片
package factorymethod_k;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 14:22
* @notify 
* @version 1.0
*/
public interface Fruiter {
    void product();
}
View Code
技术分享图片
package factorymethod_k;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 14:24
* @notify 
* @version 1.0
*/
public class Apple implements Fruiter {
    @Override
    public void product() {
        System.out.println("种出苹果");
    }
}
View Code
技术分享图片
package factorymethod_k;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 14:24
* @notify 
* @version 1.0
*/
public class Banana implements Fruiter {
    @Override
    public void product() {
        System.out.println("种出香蕉");
    }
}
View Code
技术分享图片
package factorymethod_k;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 14:25
* @notify 
* @version 1.0
*/
public interface Farm {
    Fruiter getBean();
}
View Code
技术分享图片
package factorymethod_k;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 14:26
* @notify 
* @version 1.0
*/

import factoryMethod.Fruit;

public class AppleFarm  implements Farm{
    @Override
    public Fruiter getBean() {
        return new Apple();
    }
}
View Code
技术分享图片
package factorymethod_k;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 14:26
* @notify 
* @version 1.0
*/
public class BananaFarm implements Farm{
    @Override
    public Fruiter getBean() {
        return new Banana();
    }
}
View Code
技术分享图片
package factorymethod_k;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-15 14:29
* @notify 
* @version 1.0
*/


public class Client {
    public static void main(String[] args) {

        Farm farm = new AppleFarm();
        Fruiter fruiter = farm.getBean();

        Farm farm2 = new BananaFarm();
        Fruiter fruiter2 = farm2.getBean();

        System.out.println(fruiter instanceof Apple);
        System.out.println(fruiter2 instanceof Banana);
    }
}
View Code

简单工厂,工厂方法,抽象工厂,三种工厂模式

原文:https://www.cnblogs.com/zumengjie/p/12195598.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!