OOAD之创建型模式之工厂模式
首先我们为什么要学习设计模式呢?
1)模式从经验中总结出来的,经过证实的方案,模式只有在实际系统中经过多次验证之后才能成为模式.
1 模式的概念:是具有代表性的重复性问题及其解答方案.
模式包含的要素:模式的名称 该模式所能解决的问题 解决方案 使用该模式后的效果
工厂模式
定义:工厂模式就是集中创建实例对象
1)客户类和实现类分开。消费者任何时候需要某种产 品,只需向工厂请求即可。消费者无须修改就可以接纳新产品
2)对象的创建由工厂来完成, 类之间的耦合大大减少,变成为类和工厂之间的耦合了.
public interface Fruit {
public void showInfo();
}
public class Banana implements Fruit{
//香蕉类
public void showInfo(){
System.out.println("我是一个香蕉");
}
}
//苹果类
public class Apple implements Fruit {
public void showInfo(){
System.out.println("我是一个苹果");
}
}
//梨子类
public class Pear implements Fruit{
@Override
public void showInfo() {
System.out.println("我是一个梨子");
}
}
public class SimpleFactory {
public Apple getApple(){
return new Apple();
}
public Banana getBanana(){
return new Banana();
}
}
public class Test {
public static void main(String[] args) {
Fruit a = new Apple();
Fruit b = new Banana()
a.showInfo();
b.showInfo();
}
}
如果需要生产梨子,橘子等等其他的水果的话,就需要建立很多的水果类,并且在SimpleFactory需要写得到各种水果的方法,在客户端还需要new各种水果的对象,这样对于开闭原则支持不够!还是根据情况来设计模式!
//水果接口
public interface Fruit { public void showInfo(); } //苹果类实现水果接口
public class Apple implements Fruit { public void showInfo(){
System.out.println("我是一个苹果");
} } //工厂得到水果接口
public interface IFactoryMethod { public Friut getFruit(); } //苹果工厂实现得到水果接口 public class AppleFactroy implements IFactoryMethod { @Override
public Fruit getFruit() {
return new Apple();
} } //客户端
public class Test { public static void main(String[] args){ IFactoryMethod fm = new AppleFactroy();
Fruit f = fm.getFruit();
f.showInfo(); } }
// 水果接口
public interface Fruit { public void showInfo(); } //抽象苹果
public abstract class Apple implements Fruit { public abstract void showInfo(); } //北方苹果
public class NorthApple extends Apple { @Override
public void showInfo() {
System.out.println("北方苹果。。"); } } //南方苹果 public class SouthApple extends Apple { @Override
public void showInfo() {
System.out.println("南方苹果。。。"); } } //抽象工厂(接口) public interface AbstractFactory { public Fruit getApple(); //public Fruit getPear(); } //南方工厂 public class SouthFactory implements AbstractFactory { @Override
public Fruit getApple() { return new SouthApple();
} /*@Override
public Friut getPear() {
return new SouthPear();
}*/ } //北方工厂 public class NorthFactory implements AbstractFactory{ @Override
public Fruit getApple() {
return new NorthApple();
} /*@Override
public Fruit getPear() {
return new NorthPear();
}*/ } //客户端
public class Test { public static void main(String[] args) { AbstractFactory af = new SouthFactory(); Fruit f = af.getApple(); f.showInfo();
} }
这样客户端只需要创建具体工厂的实例,然后调用工厂对象的工厂方法就可以得到所需要的产品对象。
其优点:
分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
其缺点:
不太容易扩展新的产品
如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
这样我们要增加水果种类的时候,只需要增加各类抽象水果,各类南方水果类,各类北方水果类。再到南北方工厂中增加得到增加水果的方法。
最后:
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。
OOAD之创建型模式之工厂模式的更多相关文章
- 创建型设计模式之工厂模式(Abstract Factory)
结构 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...
- JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式
上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...
- PYTHON设计模式,创建型之简单工厂模式
这个系统,感觉思路清爽,,相信多练练,多思考,就会熟悉的.. http://www.jianshu.com/p/2450b785c329 #!/usr/bin/evn python #coding:u ...
- 创建型模式(过渡模式) 简单工厂模式(Simple Factory)
简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...
- Java中的GOF23(23中设计模式)--------- 工厂模式(Factory)
Java中的GOF23(23中设计模式)--------- 工厂模式(Factory) 在给大家介绍工厂模式之前,我想和大家聊聊面向对象的那点事,在这里,引入三个概念. 开闭原则(Open Close ...
- java 工厂模式 从无到有-到简单工厂模式-到工厂方法模式-抽象工厂模式
工厂模式定义(百度百科): 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工 ...
- javascript模式 (3)——工厂模式和装饰模式
上节我们讲解了单例模式,这节我们将继续讲解工厂模式和迭代器模式 工厂模式: 工厂模式的目的是为了方便的创建对象(可以在不知道构造的情况下),通过静态方法来实现,在java或c#等静态编译语言中需要通过 ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- Java中设计模式之工厂模式-4
一.工厂模式由来 1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用. 2)简单工厂模式:后来出现工业革命.用户不用去创建宝马车.因为客户有 ...
随机推荐
- 如何充分利用 Windows Phone 高清屏幕
Nokia 最近发布两款6寸大屏手机:Lumia 1520 和 Lumia 1320.为了支持这种设备 WP 升级了操作系统GDR3 支持了 1080P 的高清分辨率(1520),虽然GER3 是提供 ...
- CentOS 7 安装MySQL 8.0.11
1. 下载安装包 wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar 下载 ...
- js框操作-----Selenium快速入门(八)
js框,就是JavaScript中的警告框(alert),确认框(confirm),提示框(prompt),他们都是模态窗口.什么是模态窗口,大家可以自行百度一下,简单说就是弹出的窗口是在最顶端的,你 ...
- ASP.NET MVC中设置跨域
ASP.NET MVC中设置跨域 1.什么是跨域请求 js禁止向不是当前域名的网站发起一次ajax请求,即使成功respone了数据,但是你的js仍然会报错.这是JS的同源策略限制,JS控制的并不是我 ...
- 【NumberValidators】增值税发票代码验证
同大陆身份证验证一样,该部分是按照国家增值税发票代码的定制规则,进行发票代码验证,如果需要查验发票信息是否正确,应该通过第三方接口(大约一毛钱查验一次),或者直接上国家税务总局全国增值税发票查验平台进 ...
- [C#学习笔记]类型对象指针和同步块索引
写在前面 看<CLR via C#>第四章时,看到了类型对象指针和同步块索引这两个概念,不知如何解释,查看过相关资料之后,在此记录. 类型对象指针 <CLR via C#>中的 ...
- VS2017按F1使用中文帮助
VS2017使用时,按F1出来在线英文帮助,可以稍作改动,出来中文帮助. 1.进入安装文件,选择单个组件,勾选Help Viewer. 2.安装完成后,在IDE中选择在线查看器中启动.
- Redis持久化策略(RDB &AOF)
redis持久化的几种方式 1.前言 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服 ...
- (2019)OCP 12c 062考试题库出现大量新题-4
4.Which four are true about creating and running a remote database scheduler jobs? A) A credential i ...
- Java 日期加减
import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date; public class Test ...