1.简单工厂模式(Simple Factory)
就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一个类。
//定义水果 接口
public interface Fruit {
void plantFruit();
void eatFruit();
}
//苹果实现水果接口
public class Apple implements Fruit {
@Override
public void plantFruit() {
System.out.println("种苹果。");
}
@Override
public void eatFruit() {
System.out.println("吃苹果。");
}
}
//橘子实现水果接口
public class Orange implements Fruit {
@Override
public void plantFruit() {
System.out.println("种橘子。");
}
@Override
public void eatFruit() {
System.out.println("吃橘子。");
}
}
//水果工厂
public class FruitFactory {
public static Fruit getFurit(String fruitName) {
//简单工厂模式
if (fruitName.equalsIgnoreCase("Apple")) { // 如果是苹果,则返回苹果实例
return new Apple();
} else if (fruitName.equalsIgnoreCase("Orange")) { // 如果是橘子,则返回橘子实例
return new Orange();
} else {
return null;
}
}
}
//测试类
public class Test {
public static void main(String[]args){
//调用简单工厂模式
FruitFactory.getFurit("Orange").plantFruit();
}
}
输出:种橘子。
总结
A:我要购买苹果,只需向工厂角色(FruitFactory)请求即可。而工厂角色在接到请求后,会自行判断创建和提供哪一个产品。
B:但是对于工厂角色(FruitFactory )来说,增加新的产品(比如说增加草莓)就是一个痛苦的过程。工厂角色必须知道每一种产品,如何创建它们,以及何时向客户端提供它们。换言之,接纳新的产品意味着修改这个工厂。
C:因此这种简单工厂模式的开放性比较差。
=============================================================
2.工厂方法模式(Factory Method)
将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。
//定义水果 接口
public interface Fruit {
void plantFruit();
void eatFruit();
}
//苹果实现水果接口
public class Apple implements Fruit {
@Override
public void plantFruit() {
System.out.println("种苹果。");
}
@Override
public void eatFruit() {
System.out.println("吃苹果。");
}
}
//橘子实现水果接口
public class Orange implements Fruit {
@Override
public void plantFruit() {
System.out.println("种橘子。");
}
@Override
public void eatFruit() {
System.out.println("吃橘子。");
}
}
//水果工厂([b]注意:此工厂声明为一个接口,具有了良好的扩展性[/b])
public interface FactoryMethod {
/**
* 工厂方法
*/
Fruit getFruit(); //定义获取水果这一过程
}
//苹果对水果工厂的实现
public class getApple implements FactoryMethod{
@Override
public Fruit getFruit() {
// TODO Auto-generated method stub
return new Apple();
}
}
//橘子对水果工厂的实现
public class getOrange implements FactoryMethod {
@Override
public Fruit getFruit() {
// TODO Auto-generated method stub
return new Orange();
}
}
//测试类
public class TestFactoryMethod {
public static void main(String[] args) {
getApple apple = new getApple();
apple.getFruit().eatFruit();
}
}
输出:吃苹果。
总结:
A:工厂方法模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。
B:工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么就不妨把抽象工厂类合并到具体的工厂类中去。由于反正只有一个具体工厂类,所以不妨将工厂方法改成为静态方法,这时候就得到了简单工厂模式。
C:如果需要加入一个新的水果,那么只需要加入一个新的水果类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的水果类而言,这个系统完全支持"开-闭"原则。
D:对Factory Method模式而言,它只是针对一种类别(如本例中的水果类Fruit),但如果我们还想买肉,那就不行了,这是就必须要Abstract Factory模式帮忙了。
=============================================================
3.抽象工厂模式(Abstract Factory)
抽象工厂模式可以说是简单工厂模式的扩展,它们主要的区别在于需要创建对象的复杂程度上。
在抽象工厂模式中,抽象产品可能是一个或多个,从而构成一个或多个产品族。 在只有一个产品族的情况下,抽象工厂模
式实际上退化到工厂方法模式。
//定义水果 接口
public interface Fruit {
void plantFruit();
void eatFruit();
}
//苹果实现水果接口
public class Apple implements Fruit {
@Override
public void plantFruit() {
System.out.println("种苹果。");
}
@Override
public void eatFruit() {
System.out.println("吃苹果。");
}
}
//橘子实现水果接口
public class Orange implements Fruit {
@Override
public void plantFruit() {
System.out.println("种橘子。");
}
@Override
public void eatFruit() {
System.out.println("吃橘子。");
}
}
//定义 肉 的接口
public interface Meat {
void buyMeat();
void eatMeat();
}
//猪肉实现接口
public class BigMeat implements Meat {
@Override
public void buyMeat() {
System.out.println("买猪肉。");
}
@Override
public void eatMeat() {
System.out.println("吃猪肉。");
}
}
//牛肉实现接口
public class CowMeat implements Meat{
@Override
public void buyMeat() {
System.out.println("买牛肉。");
}
@Override
public void eatMeat() {
System.out.println("吃牛肉。");
}
}
//定义消费者的接口
public interface UserFactory {
/**
* 水果工厂方法
*/
public Fruit getFruit(Fruit whichFruit);
/**
* 肉的工厂方法
*/
public Meat getMeat(Meat whichMeat);
}
//实现消费者的接口
public class User implements UserFactory {
@Override
public Fruit getFruit(Fruit whichFruit) {
return whichFruit;
}
@Override
public Meat getMeat(Meat whichMeat) {
return whichMeat;
}
}
//测试类
public class TestUserFactory {
public static void main(String[]args){
Fruit apple=new Apple();
Meat bigMeat=new BigMeat();
//消费者实例
User me=new User();
me.getFruit(apple).eatFruit();
me.getMeat(bigMeat).buyMeat();
}
}
输出:
吃苹果。
买猪肉。
总结:
A:抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。
B:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
C:抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品(Fruit)等级结构;而抽象工厂模式则需要面对多个产品等级结构(Fruit、Meat)。
分享到:
相关推荐
工厂模式是设计模式中的一种,属于创建型模式,它的主要目标是提供一个创建对象的接口,但让子类决定实例化哪一个类。这样,工厂模式使代码能够独立于实际的产品类型进行工作。 工厂模式的核心思想是通过一个共同的...
简单工厂模式是面向对象设计模式中的一种,它提供了一种创建对象的最佳方式。在这个模式中,一个工厂类负责创建对象,而客户端则只需要知道具体的工厂类,而不必关心对象是如何被创建的。这种模式可以有效地封装变化...
《JAVA简易学籍管理系统》是一款面向初级JAVA编程学习者设计的控制台应用程序,旨在帮助学习者理解基础的JAVA编程和软件系统设计。该系统通过简洁的代码和清晰的架构,展示了如何利用JAVA语言构建一个实用的学籍管理...
- 工厂模式可能用于创建单词对象,使创建过程更加灵活。 7. **测试与调试**: - 项目可能包含单元测试,使用JUnit等框架验证各个方法的正确性。 - 调试技巧,如使用IDE的断点、日志输出,帮助查找和修复问题。 ...
在本项目中,简单工厂模式可能用于生成不同类型的运算对象,如加法、减法、乘法和除法运算符的实例。这样做可以将对象的创建过程与对象的使用逻辑分离开来,使得代码更加模块化,也便于添加新的运算类型。 面向对象...
在本项目中,"java实现简易五子棋"是一个基于Java编程语言开发的五子棋游戏,主要用于教学目的,帮助学生理解和应用Java编程中的各种函数和方法。通过这个项目,开发者能够深入学习如何利用Java来构建一个交互式的...
在构建聊天室时,可能会用到工厂模式(用于创建Socket对象)、单例模式(用于保证服务器实例的唯一性)等设计模式,提高代码的可维护性和复用性。 通过这个项目,学生不仅能巩固Java基础知识,还能深入理解网络...
里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者...这些代码对于初学者看起来稍微复杂一些,我还有一个简易版的代码,标题为(23种设计模式的java源代码----容易理解的源代码)
Java简易聊天系统是一种基于Java编程语言开发的交互式应用程序,主要目标是提供一个简单的平台,让用户之间能够进行实时的文字交流。对于初学者来说,这样的项目是理解Java网络编程、多线程以及用户界面设计等核心...
9. **设计模式**:为了实现可扩展性和模块化,设计模式如工厂模式、单例模式、观察者模式等可能被应用到系统的设计中。例如,观察者模式可以用于实现消息的发布-订阅机制。 通过分析和学习这个【简易QQ聊天系统java...
- **工厂模式**:可能用到工厂模式来创建新的用户线程或者消息对象。 8. **日志记录** - **logging框架**:为了便于调试和跟踪问题,项目可能使用了如Log4j或Java内置的`java.util.logging`框架来记录操作日志。 ...
10. **设计模式**:在开发过程中,可能会运用到单例模式(Singleton)、工厂模式(Factory)等设计模式,以提高代码的可维护性和可扩展性。 11. **日志记录**:系统可能使用Log4j或Java内置的日志框架记录操作日志...
7. **设计模式**:虽然这个程序可能相对简单,但它依然可以应用到设计模式,如单例模式(Singleton)用于确保程序只有一个记事本实例,或者工厂模式(Factory)用于创建不同类型的文本组件。 8. **用户界面设计**:...
7. **设计模式**:除了MVC,可能还会应用其他设计模式,如工厂模式(用于创建对象)、单例模式(保证类只有一个实例)、策略模式(定义算法族,可在运行时选择具体算法)等,提高代码的灵活性和可扩展性。...
7. **设计模式**:可能运用到工厂模式、单例模式等经典设计模式,以提高代码的可扩展性和可维护性。 8. **IO流**:在读取和保存配置文件、日志文件时,Java的IO流起着关键作用。 9. **日志记录**:系统可能会集成...
例如,单例模式用于保证服务器的唯一性,工厂模式用于创建不同类型的客户端或服务器线程。 在“Java聊天室程序”这个压缩包中,你应该能找到实现上述功能的源代码文件。通过阅读和分析这些代码,你可以更深入地理解...
- **工厂模式**:用于创建对象,可以用来创建数据库连接对象或者GUI组件,使代码更加灵活和可扩展。 5. **项目结构** - **MVC(Model-View-Controller)**:一种常见的软件设计模式,模型负责处理数据,视图负责...
- 工厂模式:创建商品实例。 - 观察者模式:当购物车状态改变时,可以通知其他组件(如显示组件)更新界面。 8. **文件存储**: - 可选地,使用文件或数据库持久化购物车数据,如序列化购物车对象到JSON或XML...
7. **设计模式**:为了提高代码的可维护性和可扩展性,可以应用设计模式,如单例模式(管理数据库连接)、工厂模式(创建不同类型的书籍对象)和观察者模式(实时更新库存信息)。 8. **单元测试**:JUnit是Java中...
- **工厂模式**:创建学生或教师对象时,可以使用工厂模式简化实例化过程。 7. **测试与调试** - **单元测试**:使用JUnit等测试框架,编写测试用例验证点名功能的正确性。 - **日志记录**:通过Log4j等日志库,...