从今天开始, 正式进入了设计模式的学习, 我这个人喜欢挑软柿子捏, 就从简单工厂开始吧, 其实简单工厂并
不是一个标准的设计模式, 但是它却很常用, 而且很好用.
首先看一段代码:
package simplefactorydemo1;
/**
* 动物的接口
* @author MOYUNYU
*
*/
public interface Animal {
public abstract void run();
}
package simplefactorydemo1;
/**
* 狗的类
* @author MOYUNYU
*
*/
public class Dog implements Animal{
@Override
public void run() {
System.out.println("Dog is running");
}
}
package simplefactorydemo1;
/**
* 客户端
* @author MOYUNYU
*
*/
public class Client {
public static void main(String[] args){
Animal an = new Dog();
an.run();
}
}
相信我们平时大多数的情况都是这样来使用的, 使用接口去接收具体类的实例, 然后调用相应的方法. 考虑一下这种方式真的好么? 如果哪天不想用Dog了, 换成其他的实现类, 那么我们是不是要修改客户端的代码. 相信玩过游戏的都知道, 游戏更新的时候, 只需要更新一部分组件就可以了, 是不必修改代码的, 那么我们如何来解决这个问题呢? 好, 我们来清晰的把问题说一下: 只知道接口, 而不确定具体的实现类, 如何在不修改客户端源代码的条件下, 得到指定的对象呢?
看过标题的估计都该知道了, 在这里采取的是简单工厂的方法解决这个问题, 思路是这样的: 定义一个工厂类, 它只负责提供一个对象的实例, 客户端只需要根据这个类来获取相应的接口对象, 然后通过对象操作接口定义的方法. 那简单工厂内部要实现的功能就简单多了, 只要选择合适的实现类就行了.
第一种方式:
package simplefactorydemo1;
/**
* 客户端
* @author MOYUNYU
*
*/
public class Client {
public static void main(String[] args) throws Exception{
Animal an = Factory.createObj();
an.run();
}
}
package simplefactorydemo1;
import java.util.Scanner;
/**
* 工厂类
* @author MOYUNYU
*
*/
public class Factory {
/**
* 创建对象的方法
* @return 指定的对象
* @throws Exception
*/
public static Animal createObj() throws Exception{
Scanner scan = new Scanner(System.in);
String className = scan.next();
Class<?> c = Class.forName(className);
Animal ani = (Animal) c.newInstance();
return ani;
}
}
注: className应为"包名称.类名称"
第二种方式:
package simplefactorydemo1;
import java.io.InputStream;
import java.util.Properties;
/**
* 工厂类
*
* @author MOYUNYU
*
*/
public class Factory {
/**
* 创建对象的方法
*
* @return 指定的对象
* @throws Exception
*/
public static Animal createObj() throws Exception {
// 直接读取配置文件来获取需要创建实例的类
Properties p = new Properties();
InputStream in = null;
in = Factory.class.getResourceAsStream("Factory.properties");
p.load(in);
Animal ani = null;
ani = (Animal) Class.forName(p.getProperty("ImplClass")).newInstance();
return ani;
}
}
注: Factory.properties是在当前包下建立的文件, 内容是: ImplClass = simplefactorydemo1.Dog
优点:
工厂类是整个模式的关键,包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了.而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化.
缺点:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;这些缺点在工厂方法模式中得到了一定的克服。
分享到:
相关推荐
**Java工厂设计模式之简单工厂** 简单工厂设计模式是一种创建型设计模式,它提供一个创建对象的静态方法,客户端可以通过这个静态方法获取所需的具体产品,而无需了解这些产品的具体实现。这种模式的主要目的是将...
**设计模式之简单工厂模式** 简单工厂模式是软件设计模式中的结构型模式之一,它提供了一种创建对象的最佳方式。在简单工厂模式中,我们定义一个用于创建对象的接口,但让子类决定实例化哪一个类。简单工厂模式使...
在这个"java设计模式之简单工厂.zip"压缩包中,包含了两个视频文件,分别以“5.理解简单工厂.avi”和“4.初识和体会简单工厂.avi”命名,它们旨在帮助我们深入理解和掌握Java中的简单工厂设计模式。 简单工厂模式是...
简单工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象的最佳方式。在简单工厂模式中,一个工厂类负责创建所有相关的对象,而客户端只需要知道具体的产品类型,无需了解如何创建这些对象的细节。这种...
大话设计模式源代码之简单工厂模式 经典代码
简单工厂模式是软件设计模式中的一种基础模式,它在创建对象时起到了抽象和封装的作用,使得客户端无需关心具体对象的创建过程,只需要通过一个公共的工厂接口就能获取所需的对象。这种模式尤其适用于当系统中存在...
简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这种模式使得客户端代码不必关心具体的产品实现,只需要知道如何通过工厂获取所需的对象即可。在C#中,简单工厂模式...
简单工厂模式是软件设计模式中的一种基础模式,它属于创建型模式,主要解决对象的创建问题,降低了系统与具体创建对象之间的耦合度。在这个模式中,有一个工厂类负责创建对象,客户端通过调用工厂类的特定方法来获取...
完成了,但感觉这也没啥特别的,程序界面黑布隆冬的,内部结构也是最最平常的面向对象,于是我应用了《大话设计模式》这本书中的第一个模式——简单工厂模式,看上去还不错。界面的话,也就是输出的语句变了,system...
今天我们将深入探讨三种主要的设计模式:简单工厂、工厂方法和抽象工厂。 ### 简单工厂模式 简单工厂模式是一种创建型设计模式,它提供了一个静态方法来创建对象,而无需暴露创建逻辑。这个静态方法根据输入参数来...
### Java设计模式之简单工厂模式详解 #### 一、创建型模式概览 在软件工程领域,设计模式是一种被广泛采用的解决方案模板,用于解决在软件设计过程中遇到的常见问题。其中,创建型模式(Creational Pattern)专注...
在给定的“设计模式资料之工厂设计模式”中,我们主要关注的是工厂设计模式,这是一种创建型设计模式,它提供了创建对象的最佳方式。在这个资料中,可能会详细解释工厂模式的概念、目的以及如何在实际编程中应用。 ...
在给定的资源中,"设计模式交流之工厂模式-shannonxu-2014-10-24.pptx"可能是详细的PPT讲解,涵盖了这些模式的概念、结构、优缺点以及实际应用案例。而"Factory"可能是一个代码示例,展示了工厂模式的具体实现,包括...
深入了解 C# 设计模式之简单工厂模式 简单工厂模式是 C# 设计模式中的一种,它主要用于解决对象创建的问题,提供了一种简单的方式来创建对象。这种模式属于 Creational Pattern,主要用于对象的创建。 在简单工厂...
工厂方法、简单工厂和抽象工厂是创建型设计模式的三种不同形式,它们都关注于对象的创建过程,但各有其特点和适用场景。 1. **工厂方法(Factory Method)**: 工厂方法模式定义了一个创建对象的接口,但让子类...