设计模式总结3--工厂模式

简单工厂Simple Factory Pattern

/*首先要有一个接口和实现这个接口的很多类*/
public interface Apple {

}
-----
public class Apple1 implements Apple{

}
-----
public class Apple2 implements Apple{

}
/*要有一个工厂类,提供方法返回想要的结果 */
public class AppleFactory {

    public static Apple getApple(String name) {
        if("apple1".equalsIgnoreCase(name)) {
            return new Apple1();
        } else if("apple2".equalsIgnoreCase(name)) {
            return new Apple2();
        }
        return null;
    }
}

测试

public class Test {

    public static void main(String[] args) {
        /*以前是这样写
            Apple a1 = new Apple1();
                */
        Apple a1 = AppleFactory.getApple("apple2");

    }
}

以上这就是简单工厂模式,获取形式与Spring中的ApplicationContext的相似。我们可以写的复杂一点如下

/* 首先有可供获取的类*/
public class User {

    public void sayHello() {
        System.out.println("hello,user");
    }
}
----
public class BeanFactory {

    /* 

    初始版:
    public static Object getBean(String beanName) {
        if("user".equalsIgnoreCase(beanName)) {
            return new User();
        } else if("student".equalsIgnoreCase(beanName)) {
            return new Student();
        }
        return null;

    }*/

    /*
    进化版:
        写一个配置文件供读取
        src目录下配置bean.properties文件
        user=com.kaishengit.factory.User

    private static Properties prop;

    static{

        prop = new Properties();
        try {
            prop.load(Factory.class.getClassLoader().getResourceAsStream("bean.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static Object getBean(String beanName){
        if(prop.containsKey(beanName)){
            String className = prop.getProperty(beanName);
            try {
                return Class.forName(className).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    */

    /*
    究极版 :单例模式,放置一个map,验证是否已经存在,存在就返回,不存在就创建一个新的返回

        private static Properties prop;
        private static Map<String, Object> map = new HashMap<String, Object>();
    static{

        prop = new Properties();

        try {
            prop.load(Factory.class.getClassLoader().getResourceAsStream("bean.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static Object getBean(String beanName){

        if(map.containsKey(beanName)){
            return map.get(beanName);
        }else{
            if(prop.containsKey(beanName)){
                String className = prop.getProperty(beanName);
                try {
                    return Class.forName(className).newInstance();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}
    */

    /*究极进化版: 单例模式而是饿汉式  不管你用不用我都创建这个对象    */

    private static Properties prop;
    private static Map<String, Object> map = new HashMap<String, Object>();

    static{

        prop = new Properties();

        try {
            prop.load(Factory.class.getClassLoader().getResourceAsStream("bean.properties"));
            /*首先执行静态块里面的程序,获取所有的类的完全限定名然后创建对象 */
            for(Entry<Object, Object> entry : prop.entrySet()){
                String key = entry.getKey().toString();
                String value = entry.getValue().toString();

                Object obj = Class.forName(value).newInstance();
                map.put(key, obj);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static Object getBean(String beanName){
        if(map.containsKey(beanName)){
            return map.get(beanName);
        }
        return null;
    }

}

测试

public class Test {

    public static void main(String[] args) {

        User user1 = (User) BeanFactory.getBean("user");
        user.sayHello();
    }
}

=====================================================================
=====================================================================

工厂方法模式
 比如水果的种类增加,工厂方法模式定义了一个创建对象的接口,但由子类(实现类)决定要实例化的类
哪一个。工厂方法让类把实例化推迟到子类(实现类)。

FruitFactory

public interface FruitFactory    {    

    public Fruit createFruit(String type);
} 
public class AppleFactory implements FruitFactory{    

    @Override
    public Fruit createFruit(String type)    {    

        if("hongfushi".equals(type))    {
            return new apple1();
        }    else if("meizhou".equals(type))    {
            return new apple2();
        }    

            return  null;
    }    

} 

===========================================================================
===========================================================================
 抽象工厂
对应于上面的工厂方法模式
如果一个子工厂产生的是一种产品,比如苹果工厂产苹果,橘子工厂产橘子这样的就是工厂方法模式
如果一个子工厂产生的是一系列产品,比如热带工厂产生一系列热带水果,亚热带工厂产生一
系列亚热带水果等就是抽象工厂

===========================================================================

时间: 2024-08-01 03:32:49

设计模式总结3--工厂模式的相关文章

【设计模式】简单工厂模式

以面向对象的思想和简单工厂模式,写一个C++计算器程序,代码如下: #include <iostream> using namespace std; class Operation { public: Operation(double left, double right) { lhs = left; rhs = right; } const double GetLeft() const { return lhs; } const double GetRight() const { retur

设计模式之简单工厂模式

设计模式之简单工厂模式 动机:         不暴露实例化逻辑来创建对象.通过公共的接口创建新的对象.         这是一个简单的实现,客户端需要一个product,但是client不直接使用new对象,而是通过提供需要的对象信息来找factory得到新的product.         这个factory实例化一个具体的product并返回(转化成抽象的类),client段使用这个抽象的类而不用考虑它具体的实现. 应用举例:        也许工厂模式是使用最多的模式之一.举个例子,一个

设计模式之抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置. 他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离. 下面的代码还使用了反射与XML. 代码如下: using System; using System.Collections.Ge

设计模式之抽象工厂模式20170803

创建型设计模式之抽象工厂模式: 一.含义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 具体来说, 为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法 二.代码说明 1.主要有两个角色 1)一组互相影响的产品线(对象),也叫做产品族 2)抽象工厂类及其实现类 抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法 实现类:具体实现类是产品族的具体

设计模式初探—简单工厂模式

为什么要学习设计模式? 可重用.可维护.可扩展.灵活性好 什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 简单工厂模式的好处? (1)将具体业务和实现进行分离 (2)将多个具体业务之间进行解耦 解决的问题? 单独的类来创造

设计模式 2/23 工厂模式(二)

先要给各位同学灌输一个思想,世间本无设计模式,用的人多了,自然就有了 没有太明显的优劣之分,只道是谁更适合 如果没法理解<<工厂>>,建议阅读上一篇 设计模式 2/23 工厂模式(一) ,毕竟是一个渐进明细的过程,急不来的 这一篇分享 工厂模式 回想一下简单工厂,我们把具体类的实例化工作放在一个工厂方法里面来执行. 同时故意在上一篇提到了开放-封闭原则. 仔细想象看看上一篇的代码,到底有没有遵守这个原则,或者说这个原则有没有被严格意义的遵守,或者说遵守的程度是多少. 如果我们要新增

【幻化万千戏红尘】qianfengDay10-java基础学习:成员内部类、静态内部类、局部和匿名内部类,设计模式之简单工厂模式

课程回顾: 接口:1.属性:public\static\final2.方法:public\abstract 多态:1.静态化(编译时)多态重载2.动态化(运行时)多态重写对象转型 1.向上转型 2.向下转型 今日内容:内部类:定义在类的内部的类1.成员内部类格式:[修饰符] class 类名 { }内部不能有静态的属性和方法,可以访问外部类的属性,也可以调用外部类的方法 在静态方法中的使用格式:外部类 外对象=new 外部类();成员内部类 对象名=外对象.new 成员内部类(); 2.静态内部

JS设计模式(动态工厂模式)

<!--引入的核心JS文件--> <script type="text/javascript" src="CommonUtil.js"></script> <script type=text/javascript charset=utf-8> <!--JS设计模式(细粒度工厂模式)--> //搭建一个工厂环境 买什么车——(去什么店)卖车的店——卖车——生产车 //卖车店 super Shop 只有卖车的方

iOS设计模式 - (3)简单工厂模式

iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/details/40381721 一.简述 简单工厂模式(FACTORY),通过面向对象的封装,继承和多态来降低程序的耦合度.将一个具体类的实例化交给一个静态工厂方法来执行. 该模式中的角色包括: 工厂类(Simple Factory): 只包含了创建具体类的静态方法. 抽象产品(Product):

大话设计模式_简单工厂模式(Java代码)

简单的描述:一个父类.多个子类,实例化那个子类由一个单独的工厂类来进行 图片摘自大话设计模式: 运算类: 1 package com.longsheng.simpleFactory; 2 3 public class Calculate { 4 5 private double firstNum; 6 private double secondNum; 7 8 public double getFirstNum() { 9 return firstNum; 10 } 11 12 public v